@L}5 _$% l0$)$$Hȱ$ UhL" `e$$%`$%`  R@P!( L(1   Y I`  d  Ld M * @  $ % CC$$)%1 Udߥ$9%: !0 S$% DD˙`  }J)Lr d M * @  $ % CC$$)%1 Udߥ$9%: !0 S$%} DD˙`  }J)Lr J  ((  p L ()   J}L= ( L 0q A    IB JC;? D W } LL  ` W )LA!  ߰")-݆ p" } $G@LL 08`Q")<2Q0 -G$Ș݆ UL# ; p8(()(0ʥ)NQ` }$GȘ݆LU )L ݆ L GȘ ݆LL )W>Z   HH)H }p h  hyhy D L> L JJ    ! LA*` BF }7'8  M HN H` 8 Z  \LdJJ!"! GFE@F (!L }EE !E^ ^ E E7EȩEdE/EȩE  D } .L }  ;F d  ;?F7F? ( .   Z D LL d } . D  L    p  E` , d)  D L) 0BM݊L݉} ML  N݆ L NLML [ TEqEHȱEqEh 0Gȹ G} HLL GɛL  LFREE SECTORS G) *Gȩ GȽG GȌ*jj >G} C8jJ3j2CD( C202C ԠBX` N 1? l LlD:RAMDISK}.COMLu L1 L ;LHL  T`  `1  ɐ     `TU  } L ? .  t`GBJ ~DEHI B V0dV!}QDEHI VF9 ,0 ,0 s0hhL  L` H hDHEh"}DEL8HI4 0 HI,0 0  9 .G VLO#},0 L4*IJ`llD1:AUTORUN.SYSNEED MEM.SAV TO LOAD THIS FILE.D1:MEM.SAV J y08 B|DEHI$} V0 0`B;DEL`?<0LV`@ʆ v s? F0Ξ05: [ BDEHI%} VY8 B V  @  /DE `E:D1:DUP.SYSERROR-SAVING USER MEMORY ON DISKTYPE Y TO &}STILL RUN DOS B;DE J  (` 9 V⪍ ઍ  -'}LLu ÝDEHILV 9 .l 9 .l  `` s$B BH(}I|DE V BLV nB,DE JLV B V BLVDEIʩ BꭝLu  } 3E:}DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.A. DISK DIRECTORY I. FORMAT DISKB. RUN CARTRIDG*}E J. DUPLICATE DISKC. COPY FILE K. BINARY SAVED. DELETE FILE(S) L. BINARY LOADE. RENAME FILE M. RUN AT ADDRES+}SF. LOCK FILE N. CREATE MEM.SAVG. UNLOCK FILE O. DUPLICATE FILEH. WRITE DOS FILES P. FORMAT SINGLEL !N',}#"&))9(&*)/h)''-&؆莟R'S  vL/ˢ L }Insert DOS 2.0s, type Y Λx -}DEfHI 1莏#q! @ y0ɛ8A0,' ȅ 1 1ild! 1L!NO SUCH ITEMSELECT.} ITEM OR FOR MENU! 0 .z:*{}.|{ 1 0 0JB 18L%|DL/}%DIRECTORY--SEARCH SPEC,LIST FILE?[# 0 0 &|D3" 1L!NOT A DISK FILEN !B 1L!E# 1 !BD0}ED:}:1BJ|DE 1DEBHI 1 h0ߢ 0.1}  0?詛 1 y0YЛ 1 ;#L" ;#L! BL1TYPE "Y" TO DELETE...DELETE FILE SPEC2}COPY--FROM, TO?OPTION NOT ALLOWED736 FREE SECTORS COPYING---D1:DIRECK.COMl# 0|D .L/%#3}##JB|DE 1BHID#E 1#0: B 1L!#͑### B 1#c$0SY4}S1}:## # # .#Ƚ# # 𩛙## 1,#PD#ELJ- <.BJD#E 5}1 1HH 0hh|DL%1}:̳# L% #D#EL% 1 0 . .0O% 1L!WILD CARDS NOT A6}LLOWED IN DESTINATION 0 <.|K}N 2 FORMAT. t* 5) 1L!`) 0NΞ 0 L1) 1 L!BAD LOAD FILELOAD FROM WHAT FILE?) 0 ?}0#B 1L!WHAT FILE TO LOCK?) 0 0$B 1L!WHAT FILE TO UNLOCK?DUP DISK-SOURCE,DEST DRIVES?TYPE "Y" IF OK TO US@}E PROGRAM AREACAUTION: A "Y" INVALIDATES MEM.SAV.FE! +L1   `*  70 2 2A} 0.* 1 y0 0)INSERT BOTH DISKS, TYPE RETURN^, 1 y038逍 N, 1L! ,B}C, t*  Lx+, 0 ^, 1 y0 , ,0,0 ,L+ ,I0 ,Vǭ0C}Ξ, 0 }, 1 y0C,ШC, 0K'!" H H 'h h Lx+!EF 5L1L!D,I,HhD}` NOT ENOUGH ROOMINSERT SOURCE DISK,TYPE RETURNINSERT DESTINATION DISK,TYPE RETURNE}`  `8 rL1`-* 1P* 1 y0Y`hhL!NAME OF FILE TO MOVE?- 0 0|DL% <.F},^ 1 70 0 .@L# .BJ 1  DEHIB V L1 ,} 1 70,L.  G}JB|,#P#DE 1 HI BDEHHII 1 B 1 ,^ 1 70,0La- B V,#PH},^ 1 70 0L#L!-* 1P* 1 y0Yj383}mm ݭI}}`8}``|* ? ɛ,`|:-)| / 1L!`DESTINATION CANT BE DOJ}S.SYS0 0H{ 24Δ 28/L!/) 2 Π 2 0 ξK}hAΞB,0 J 1 BDEHI,HÝDE 1HIHIDELSAVE-GIVE L}FILE,START,END(,INIT,RUN)O S0 1`BDEPHI V` S0H 1 L!M}0 0 1L~0`PLEASE TYPE 1 LETTER,0`hhL! 70 1L0L<1 ,;ɛ7,"ɛ:ݦ1ݥN}A"D|ݤD|ȩ:|ȩ|ɛ,,(/+.ީ1 1,ɛ`轤{NAMEO} TOO LONG B VL!` L1I H1EΝDL1|mDiE` V0`8d/8 i:222 1 LP}!ERROR- 138ɛ+,' 20*.. өr2 1``2TOO MANY DIGITSINVALID HEXAQ}DECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8uR} ECIMAL PARAMETER800 0 8 00`,0'D800 H,ɛh`2L1NEED D1 THRU D8u Here is the (long awaited?) source files for MYDOS 4.5. They are a 4 part encoding of an ARC file containing MAC65 tokenizeT}d assembly language source code. Concatenate the parts, run through a UUDECODE, deARC using Bob Puff's UNARC utility, then aU}ssembly (following the instructions in the READ.ME file) using disk or cartridge based MAC65. If you have one of the early vV}ersions of the MAC65 cartridge one instruction in the DOS code will be incorrectly generated (JMP 0 assembles to $FF:$00:$00)W} but the backpatches from DUP will correct it -- don't worry, be happy, ... MYDOS is a disk operating system built up as an X}enhanced version of Atari DOS 2.0 -- it supports most RAMdisks, hard disks, single, enhanced and double density floppy disks,Y} and it could be considered user friendly (at least it does not require so much typing to change the unit number of the RAM dZ}isk as it used to!). Enjoy it, Charles Marslett st it does not require so much typing to change the unit number of the RAM d1A EIX; BUILD.M65 MYDOS utility0ADOUBLE DENSITY MYDOS3 SYSTEM DISK BUILDERA(X;29X; Copyright 1984, Charles M \}arslett, Wordmark Systems<X;FIX; Permission is granted by the author for any use whatsoever of thisPHX; code, so long ]} as this notice remains in the source code, and soZLX; long as the source to this routine, however modified or unmodified ^},d.X; is made available for a nominal cost.nX;xX;(X; Some important absolute addressesX;CIOVV;;CIO ENTRY _} VECTORX;0MENUP;;THE RUN ENTRY POINT OF "MDUP.OBJ"X;CORIGINH;;GOTTA BE BIG ENOUGH TO NOT HIT EITHER COPY O `}F MYDOSX;&ZCTR;;A GENERAL PURPOSE COUNTER&BPTR;;A GENERAL PURPOSE POINTER0ZPTR;;AND ANOTHER GENERAL PURP a}OSE POINTERX;/X; Define the fields of IOCB $10 that I useX;Q" ICMD,6 IBUF@ ILENJ I b}AUX1T IAUX2^X;hOX; The BUILD program itself -- loads MDOS.OBJ and MDUP.OBJ into memory aboverOX; itself, then r c}elocates the code down over the previous version of MYDOS|OX; that we are running with and starts it up. This is how we c d}reate a newX; version of MYDOS.X; ORIGINX;START$>SIGNON%%>SIGNON;;LOG ONTO THE SCREEN DMSG e}X;Q> PBPTR%>'BPTR;;POINT BPTR AT $C000Q>PSAVC;;SAVC IS NOW $FF$>4CLRCP@BPTR7;;FILL $C f}000 TO $CFFF WITH $FF BYTES&30 HCLRC: #BPTRD0N HCLRCXX;bQ>BUFFERl PBPTRv'Q>BUFFER;;POINT BPTR g} AT "BUFFER" PBPTR$> Q>0MVLP1P@BPTR7;;FILL 8K BUFFER WITH $00 BYTES3 HMVLP1 #BPTR0 HMVLP1 h}X;,X; COPY NEW DOS CODE FROM FILE "MDOS.OBJ"X;$>MSG01%>MSG01 0 DMSG;;ANNOUNCE WE ARE READING "D2:MDOS. i}OBJ"%>DOSFIL Q>DOSFIL*& LOADBF;;LOAD CONTENTS OF MDOS.OBJ4X;>4X; COPY NEW DOS AND DUP CODE FROM FILE "MDUP j}.OBJ"HX;R$>MSG02\%>MSG02f0 DMSG;;ANNOUNCE WE ARE READING "D2:MDUP.OBJ"p%>DUPFILzQ>DUPFIL& LO k}ADBF;;LOAD CONTENTS OF MDUP.OBJX;$X; MOVE BUFFER DOWN TO LOW MEMORYX;$>MSG03%>MSG036 DMSG;;ANNOUNCE l} WE ARE RELOCATING DOS AND DUP CODEX;Q> PZPTRQ>+PZPTR;;SET DESTINATION POINTER TO $0700Q>BUFFER m} PBPTRQ>BUFFER)PBPTR;;SET SOURCE POINTER TO "BUFFER"$X;.%>8MVLP2Q@BPTR7B.P@ZPTR7;;COPY 256 BYTES n}AT A TIME UNTIL WEL)3;;ARE ABOUT TO OVERWRITE BUILD ITSELFV4HMVLP2;;(THIS IS TOO MUCH, I HOPE, BUT IT WORKS)` #BPTRj o} #ZPTRt QZPTR~R>START HMVLP2X;X; REINITIALIZE SYSTEMX;$>MSG04%>MSG04/ WFSTR;;AN p}NOUNCE STARTUP AND WAIT FOR A KEYX;# DOSINI;;REINITIALIZE NEW MYDOSX;$>Q> PICMD Q>, PIAUX1 q} Q>EC( PIBUF2 Q>EC<PIBUFF1 CIOV;;REOPEN THE KEYBOARD/SCREEN "E:" DEVICEPX;Z$>MSG05d%>MS r}G05n6 WFSTR;;ANNOUNCE WE ARE READY TO RUN THE NEW MYDOSxX;;!@MENUP:;;THEN GO WHOLE HOG: USE "H" COMMAND TO SAVE IT s}X;X;.X; LOAD CONTENTS OF OBJECT FILE INTO BUFFERX;LOADBF'IBUF PIBUFQ> PMINAD'PMINAD;;SET t}LOW ADDRESS AT $FFFFQ> PICMDQ> PIAUX1Q>%PMAXAD;;SET HIGH ADDRESS AT $0000" PMAXAD, PIAUX26$> u}@* CIOV;;OPEN D2:MDOS.OBJ OR D2:MDUP.OBJJ IGOTFILT$>NOFIL^%>NOFILh/ DMSG;;REPORT IT IF WE CANNOT OPEN TH v}E FILEr!@ :|X;GOTFILQ>;;ELSE,!PICMD;;CHANGE COMMAND TO READQ>BUFAD PIBUF$Q>BUFAD;;BUFFER TO LO w}CAL ONE PIBUFQ> PILENQ>PILEN;;LENGTH TO 2 BYTES$> CIOV;;AND READ THE HEADER GINVHDR;;IF x} ERROR, REPORT IT QBUFAD MBUFAD!R>;;ELSE, VALID HEADER WORD?& IRDNXTB00INVHDR$>NOHDR;;IF NOT, REPORT THA y}T ERROR:%>NOHDRD DMSGN!@ :XX;bARDNXTBQ>BUFAD;;ELSE, READ NEXT WORD PAIR (START-END ADDR)l PIBUFvQ> z}BUFAD  PIBUFQ> PILEN;;SET LENGTH TO 4 BYTESQ> PILEN$># CIOV;;READ START/END ADDRESSES# {}IRDDATA;;IF NO ERROR, LOAD DATA)>;;ELSE IS IT AN EOF?$HABORT;;IF NOT EOF, REPORT ERROR:!MOVER;;IF EOF, WE HAVE LO |}ADED IT ALL, RETURN NORMALLYX;RDDATAQBUFAD %BUFAD  )MAXAD8DNOTMAX;;IF THIS BLOCK SETS A NEW MAX ADDR }}ESS LOADED  HNEWMAX* RMAXAD4 DNOTMAX>4NEWMAX'MAXAD;;UPDATE THE MAX ADDRESS COUNTERH PMAXADR NOTMAX;\ SBUFAD ~}f PZCTRpCz SBUFAD PZCTR #ZCTR HLENOK #ZCTRLENOK DEBUG1 %BUFAD QBUFAD>)MINAD;;A }ND IF THIS BLOCK SETS A NEW MIN ADDRESS LOADED DNEWMIN HNOTMIN RMINAD+ENOTMIN;;UPDATE THE MIN ADDRESS COUNTER }NEWMIN)> DNOTMIN 'MINAD PMINAD$ NOTMIN)>. DDONTMV8 ')>;;DO NOT USE THE INDIRECT BUFFERB 1EDONTMV;; IF } THE DATA IS AT <$0700 OR >$BFFFL O>BUFFER V 5` Cj O>BUFFER t ?~ 7 DONTMVPBPTR 'BPTR D }EBUG2 Q> PILEN %PILEN;;READ ONE BYTE AT A TIME GETNB$> CIOV &ISTBYTE;;AND IF NO ERROR, STORE IT ABO }RT$>ABORTED %>ABORTED  DMSG;;REAL I/O ERROR !@ :;;EXIT TO DOS X; STBYTE%BPTR HSTBY0( 7%BPTR;;TE }ST FOR BUFFER POINTER BEING STILL VALID2 )>< HSTBY0F PSAVCP FSTBY3Z STBY0%>d %P@BPTR7;;STORE THE BYTE JUST READ }n STBY3#BPTRx HSTBT1 #BPTR STBT1QZCTR !HSTBT2;;INCREMENT THE POINTER "ZCTR STBT2"ZCTR QZCTR &L }ZCTR;;DECREMENT THE BYTE COUNT 6HGETNB;;IF STILL IN THIS BLOCK, READ THE NEXT BYTE &!RDNXTB;;ELSE, READ THE NEXT BLOC }K X; MOVERQ> ;;DONE WITH LOAD, PICMD $>  CIOV;;CLOSE THE LOAD FILE PSTR A(A=" QMINAD, 9 PHEX; };REPORT THE CURRENT MIN AND MAX BUFFER POINTERS6 QMINAD@ PHEXJ PSTRT A-A=^ QMAXADh PHEXr QMAXAD| PH }EX $>LOADED %>LOADED DMSG ":;;AND RETURN TO MAIN LINE CODE X; X; PROGRAM FILE (NEW FMS) X; DOSFIL }AD:MDOS.OBJA= X; (X; PROGRAM FILE (NEW UTILITY PROGRAM) X; DUPFIL AD:MDUP.OBJA= X; X; CONSOLE KEYBOARD/DISP }LAY X; EC AE:A=& X;0 ,X; DISPLAY A MESSAGE AND WAIT FOR 'START': X;D WFSTR DMSGN Q>X Pb %WFSTRTQ;;REA }D CONSOLE SWITCHESl M>v HWFSTRT;;WAIT FOR START : X; %X; DISPLAY A MESSAGE ON THE SCREEN X; DMSG&ZPTR 'ZPT }R Q> PZCTR MSGLP%ZCTR Q@ZPTR7 FDXIT BYTOUT #ZCTR HMSGLP X; DXIT: X;* CODE A0123456789 }ABCDEFA4 X;> 0X; DISPLAY A 4 DIGIT HEX NUMBER ON THE SCREENH X;R PHEX5\ V?f V?p V?z V? > QCODE9 BYTOUT 7 }M> > QCODE9 X; BYTOUT$> &ICMD $> &ILEN &ILEN CIOV:X;$ PSTR7. PZPTR87B } PZPTRLPLOOP#ZPTRV HPOUT` #ZPTRj POUT$>t Q@ZPTR6~ FPEXIT BYTOUT !PLOOPX;PEXITQZPTR }5 QZPTR5:X;+X; REPORT THE HIGH AND LOW BUFFER LIMITSX;DEBUG1 PSTR A(A=  QBUFAD PHEX }QBUFAD( PHEX2 PSTR< A-A=F QBUFADP PHEXZ QBUFADd PHEXn:xX;DEBUG2 PSTR A)A == }== ==== =:X;.X; ROUTINE TO REINITIALIZE THE LOADED MYDOSX;DOSINIQP  Q } P '!@ :;;==REINITIALIZE ENTIRE DOS/DUPX;*X; IMPORTANT MESSAGES FROM OUR SPONSORS"X;,SIGNON =6* A }ӠɠӠA=@0 A 򠠠A===JX;T"MSG01 ALOADING D:MDOS.OBJA=^"MSG }02 ALOADING D:MDUP.OBJA=hLOADED ====r ====| ==== ==== ==AEDA== }=,MSG03 AMoving DOS/DUP into placeA==4MSG04 APRESS TO INITIALIZE NEW DOSA==0MSG05 APRESS }TO ENTER NEW DOS.A==X;*NOFIL ACannot open Object FileA==0NOHDR AInvalid Header in Object FileA==,AB }ORTED AI/O Error, load abortedA==X;'X; BUFFER FOR PATCHING A RUNNING DOSX; MAXAD MINAD SAVC }BUFAD;;FOR ADDRESSES&BUFFERSTART0X;:(X; EXECUTION FORCED, LOAD RUN ADDRESSDX;NX START;;run address }bX;D;;FOR ADDRESSES&BUFFERSTART0X;:(X; EXECUTION FORCED, LOAD RUN ADDRESSDX;NX START;;run address HLݠJ 3JLL #K 3J J H6K 3JJ HdK 3JL}HK #J JB,J DJE V䢢K #JlTULLRZLL[ V K 3Jl RTLUX}Y V0 L-L ڠK 3Jl TLUXY VrLILLL LLL8LL JLLLL} LL iHiEh JXY V K 3Jl LLI R V }J(L YJL} YJ }J-L YJL YJIK 3J`D:MDOS.OBJD:MDUP.OBJE: 3JЭ)` lJ`0123456789ABCDEFHJJJJIJ lJh)I}J BHI V`hh lJLJHH` }J(L YJL YJ }J-L YJL YJ` }J)`  l Ӡ}ɠӠ 򠠠LOADING D:MDOS.OBJLOADING D:MDUP.OBJEDM}oving DOS/DUP into placePRESS TO INITIALIZE NEW DOSPRESS TO ENTER NEW DOS.Cannot open Object FileInvalid }Header in Object FileI/O Error, load abortedHW DOSPRESS TO ENTER NEW DOS.Cannot open Object FileInvalid 6 "X;save#d:MDOS.M65 MYDOS moduleLISTFLGX;(LISTFLG2EI<FALARGE DISK FMSAPX;Z>D:MDOS1.M65}d>D:MDOS2.M65n>D:MDOS3.M65xX; BOOTNDI+;;START DUP HERELISTFLGEIFMSAPX;Z>D:MDOS1.M65cML }  X c0C)HCCH Mhhݩh `eCDiCD`  RyH}P   * 1H0芢@) Y0.Ș`p#(PMRR\ \b Pg`i} 0  % @ / ՠ`d   0DDԝL  }N@  )?HI Y0`HIJH) * J j * hJJJ )HJ h i     } YS S0 i`ϣ߳ϣ߳H J3xj2h  \} 1 |9 ӭ45(420 *(0241өX.`] X  R *i)Lvw  ~*}PE 5 LN(G E  r s k rsrL ( E LO(0d( L iE0O +)$IC  H S8 }q p h   j 8no CDLQ CFl MY T  LO Ri)Llk2'")}*F$F$F$F$F$ 5 )ШF/Șl]kpqС,LQ/A! Ti)Zlk@ ܬ/i)(")}")k$F$F$F 5$/L /lF@jj(LNkle$$%8(k()` R UP8 ELO Ri)^>jf | Nr}C s  ) vw5g   enfo Glvw LQ@iLm>j FL ~Jjjjii p} qEhjlrs`LQ:$ȱ$@+[_#{ 8  Խut! aiQL 8   E I }  ] C H h    ˰ 8  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ}? ѩ/  [ /Lj0?MoLn FjMqLp NklLOMHLQnLoMl}NLO R"(+ըHH`Q R!!  % !   / .   FȑF! /GF \}H"+0+* ! F tLQnm: J~nTF1F  *n+)5! n (, nID)1JJJ}n(n*o I ,0  ci a oF? @ , 8,0 ʩ0H Eh  } i  D ]DmmFLQvtu`*&!*@h ] 0 E^0}` c 0l$$%()()%*&J%H,@hH hH@,h $% 8i8$(%)0hh}H ]h`() c 0H c 0 h`hhh&JJ ](ll  LQ0  /qnoHH 9 9 H} H  I9  9  Nd EH  Q8 o n  FnoL HII/ Ih8`h`Ln}on`no`u F E VEhLO/luF l0BF/lɜɛ׽hE N  b }VFL FREE SECTORS C H) *Fh ):FȽ F FC IH' 0 d  i:F}ȩ/F.l`CD/08HDICIHȰ/F`ȱ$>.+.i ȱ$:刄H !A \ Hȱ$*?ȝ }2. ? [_{ ,0-:) 0$:>WI  IТ,LQH  0hLd ~ t u`C} ?( 0(C.` E  R =! .ti S0N EE D XC )0')AY  )ע} ? 0E088FG \on  (HhLcL3 iJ i Lqp 0=rspnqopq}lk`jZj0  j FL`HFhȑFȽlFi0 h FFLFpvqwgneofLF pq7  G}0i 0 FJJh1FqȱFpȱFk`B!08`hEE D 8. =D}tui( TʩL`b!)   } cȌaȌd b`aabH8 hdaHcd8 cH hHH  \h hc` =Hh} I8ih( t  ( t(!` L\CJfCJfCJfCDfC` a  HII  INdh  `h}  `n)8jHniPoijIjFIjFIjh` a I 38  8H0 I  ' H LQ8j }Y  8j NdY  &I &I &IHeH.pIiq  `!.莿 2Jjj }.m Ȉ!}m FG` ɩLQ z  e Hi04 \ Ȍ  8 i h }!`I0 `C Y8.`DOS SYS I  ` ~ݩ.C/`ba.m۩m}ѤC9 `C L] `C Y8.`DOS SYS I  ` ~ݩ.C/`ba.m۩m', #X;save#d:MDOS1.M65 MYDOS module9X; Copyright 1984, Charles Marslett, Wordmark SystemsX;(IX; Permission is gra}nted by the author for any use whatsoever of this2HX; code, so long as this notice remains in the source code, and so<LX}; long as the source to this routine, however modified or unmodified,F.X; is made available for a nominal cost.PX;Z}X; DISK I/O EQUATESdX;n4DKADDR1;;SIO ADDRESS OF FIRST DISK DRIVE (D1:)x8TODK;;STATUS BYTE FOR A DATA TRANSFER TO }THE DISKRDSTAT S;;SIO COMMAND EQUATE FOR READING THE DRIVE STATUSFWRITEV W;};SIO COMMAND EQUATE FOR WRITING A DISK WITH VERIFICATION/FMTCMD !;;SIO COMMAND TO FORMAT A DISKETTEX;.LK128};;LOC}ATION OF 128 BYTE SECTOR LINK.LK256;;LOCATION OF 256 BYTE SECTOR LINKX;X; ZERO PAGE EQUATESX; WARMST }DOSVEC  DOSINI "X;, 6 ICHIDZ@ ICDNOZJ ICCOMZT ICSTAZ^ ICBALZh ICBAHZr ICPTLZ}| ICBLLZ ICBLHZ ICAX1Z ICAX2Z CURFCB DATBYTX; CHKSUM1 BUFR2X;C} FMSZPGDIRDSPFMSZPGDIRSECFMSZPG CURFNO FMSBPT& TMP10 TMP2:X;D.X; DEFINITIONS FO}R THE ATARI ROM EXECUTIVENX;XDSKTIMFbRUNADRlINIADRvMEMTOPDVSTATX;$X; SIO COMMAND B}UFFER DEFINITIONX; DDEVIC DUNIT DCOMND DSTATS DBUFLO DBUFHI DTIMLO DBY}TLO DBYTHI  DAUX1 DAUX2 X;*X; I/O SYSTEM DEFINITIONS4X;>1HATABS;;BASE OF THE DYNAMIC HANDLER} TABLEHX;R8X; CIO COMMAND TABLE BASE DEFINITIONS (FOR IOCB $00)\X;f@p ICHIDz ICDNO ICCOM ICSTA} ICBAL ICBAH ICPTL ICPTH ICBLL ICBLH ICAX1 ICAX2 ICSPRX;&X; CAR}TRIDGE SUBSYSTEM DEFINITIONSX;(CARINIT;;LOCATION OF INIT VECTOR"CARTEST;;LOCATION OF FLAGS$&CARRUN;;LO}CATION OF RUN VECTOR.X;8X; 800XL MAP CONTROLBX;LMAPREGVX;`!X; OTHER I/O PORT DEFINITIONSjX;t NMIEN~}X;X; ROM VECTORSX;(DSKINVS;;OLD DISK I/O ENTRY POINT$SIOVY;;SERIAL I/O ENTRY POINTX;X; DOS BOOTING} CODEX;X;X; DISK BOOT SECTORS (3)X;;;DOS.BOOT LOADS AT 0700#BOOTFL AMA;;indicate new MYDOS+BOOTL };;NUMBER OF SECTORS IN THE BOOT /BOOTAD BOOTFL;;ADDRESS OF BOOT CODE IN RAMBOOTIN INIT*!INBOOT;;JUMP TO THE BOOT C}ONTINUATION(6FILES ;;NUMBER OF FILES THAT MAY BE OPEN AT ONCE23X;DRIVES = * ;USED TO BE BIT PATTERN FOR DRIVES<RAMDK}U  ;;RAM DISK UNIT #F-X;BUFALC = * ;USED TO BE BUF. ALLOC. DIR.P#DEFAULT ;;DEFAULT UNIT NUMBERZ:DOSEND BOOTND;;ADDR}ESS OF THE FIRST BYTE OF FREE MEM.d2SECDAT ;;1=128 BYTE SECTOR/2=256 BYTE SECTORn(DOSLOC ;;SECTOR ADDRESS OF DOS.SYSx}1DLINK LK128;;OFFSET TO THE SECTOR LINK FIELD-DOSAD BASE;;ADDRESS TO LOAD DOS.SYS INTOX;8INBOOT%DOSAD;;SET UP S}TART OF DOS AS BUFFER ADDRESS QDOSAD$ BTSET;;LOW ADDR IN Y, HIGH IN AX;QDOSLOC,%DOSLOC;;PUT DOS DISK AD}DRESS INTO (A,Y)X;X; DOS.SYS INPUT LOOPX;"INITLP,;;CLEAR CY, 'DO A READ'%$SECDAT;;GET CODE FOR SECTOR SIZE$F}NODOS;;IF ZERO, NO DOS ON DISK!" DKIO;;INVOKE DISK I/O ROUTINE,GNODOS;;IF AN ERROR, RETURN NO-DOS ERROR"%DLINK;;POI}NT TO LINK,,Q@FMSZPG7;;CHECK FOR NEXT LINK (10-BITS)6ANDCDM>;;BEING ZERO,@ 5;;SAVE UPPER BYTE OF ADDRESSJ3T)L@FMS}ZPG7;;IF SO, LOADING IS COMPLETE^ FBOOTXTh4Q@FMSZPG7;;ELSE, IT'S THE ADDRESS OF NEXT SECTORr5;;SAVE LOWER BYTE ON STACK}|2 MVBUFR;;THEN ADJUST THE BUFFER POINTER IN DCB7!?;;RESTORE LOWER BYTE TO Y-REG(7;;RECOVER UPPER BYTE OF DISK ADDRE}SS!DINITLP;;AND CONTINUE LOADINGX;)NODOSQ>;;NO BOOT PROGRAM ERROR CODE ;;SKIP SINGLE BYTE (LDY #)X; BOO}TXT73DOSXITT?;;SET CARRY, CONVER CODE TO FINAL VALUE?;;PUT CODE INTO Y-REG:;;AND EXITX;4X; MOVE BUFFER POINTERS} TO NEXT AREA TO BE LOADEDX;MVBUFRQDLINK&,04OFMSZPG;;ADD DLINK TO THE CURRENT BUFFER ADDRESS:?;;LOW BYTE TO Y-R}EGDQFMSZPGNO>XBTSET'FMSZPGbPFMSZPGl+BUFSET'DBUFLO;;STORE LOW BYTE INTO DCBvPDBUFHI;;THEN UPPER BYTE}:X;-X; PERFORM DISK READ(CY=0) OR WRITE (CY=1)X;3DKIOPDAUX2;;STORE UPPER BYTE OF SECTOR ADDRESS'DAUX1;;THE}N LOWER BYTE DKIO2%> Q>READ#DSETRTY;;IF CY=0, READ INTO RAM QWRCMDBX;%SETRTY'TMP1;;SET NUMBER OF TRIES}DKFMEPDCOMND, (Q>WRITE;;CLC AND CONSTANT FOR POKERSWRCMDB   'DTIMLO*&Q>;;ASSUME A 128-BYTE SECTOR SIZE4}0> FSTBUFLH$DAUX2;;SECTOR > 256?R HSET256\ $DAUX1f(>;;SECTOR > 3pDSTBUFL;;IF NOTz)SET256T?;;MAKE A 256 BYT}E SECTOR SIZESTBUFLPDBYTLOU? PDBYTHI+%>DKADDR;;PUT DISK DEVICE CODE INTO DCB 'DDEVICIORTRY"TMP1 GDIO}XIT $DCOMND2A"$>FROMDK;;ASSUME DATA ==> DISKM>&HISREAD;;IF NOT X0,X7,X8 OR XF, OK $>TODK;;ELSE, DATA =}=> DISK )ISREAD&DSTATS;;RESTORE STATUS TO DCB SIOV;;DO THE I/O OPERATIONS$ 1. GIORTRY;;IF NOT OK, RETRY8 X;B 4DIO}XIT$CURFCB;;ELSE, LOAD FCB OFFSET AND STATUSL 3V C` :j X;t ,X; FIXED RAM DEFINITIONS IN BOOT SECTORS:~ X; ,DIUNIT;};UNIT NO. OF CURRECT DIRECTORY .CDIREC;;SECTOR NO. OF CURRECT DIRECTORY HOLFN 5STATE p;;DUP loaded, MEM.SAV ina}ctive, Warmstart X; bit 7 -- MEM.SAV in use X; bit 6 -- DUP.SYS loaded &X; bit 5 -- AUTORUN.SYS already run #X; bit 4 -}- Initial BUILD active X; "STKPSV;;SAVED STACK POINTER X; ;;MUST MATCH DUP LOCATION X; 2TRACKS #=(=P=M};;TRACKS IN EACH DISK FORMAT X; 5SECSIZ =======;;BUFFER SIZE TABLE( X;2 %DRVDEF R=R;;DRIVE CONFIG TAB}LE:<  =;;BIT 7=1 => NO DRIVEF % =;;BIT 6=1 => ATARI 810 DRIVEP / =;;BITS 5-4 IS TRACKS (SEE ABOVE TABLE)Z X; BI}T 3=1 => DOUBLE DENSITYd "X; BITS 2-1 ARE DRIVE STRP RATEn X; BIT 0=1 => DOUBLE SIDEDx X; X; DOS.SYS PROGRAM FOLLOWS X;} DKEPT DKOPEN  DKCLOS  DKREAD  DKWRIT  DKSTAT DKXIO X;  X; X; DOS INITIALIZ}ATION CODE X; X; 2INITQ>i;;INITIALIZE THE CURRENT DIRECTORY 6PCDIREC;; TO THE ROOT DIRECTORY OF THE BOOT DRIVE"} Q>i, PCDIREC6 X;@ X; IDENTIFY DRIVE TYPESJ X;T $>^ IDRVLP&DUNITh , ZERDVS;;ASSUME THE DRIVE IS NOT PR}ESENTr QDRVDEF9| 6GNXTDRV;;IF IT IS NOT DECLARED, WAIT FOR AN ACCESS ! JSTRD;;ELSE READ IT'S STATUS *FNXTDRV;;IF AB}SENT, GO TO THE NEXT ONE %> WOTCPYQWOTDCB8 PDDEVIC8 1 IWOTCPY QDRVDEF9 R>@ *ENXTDRV;;IF NOT CON}FIGURABLE, CONTINUE %SECSIZ9 1 SETDRV;;ELSE, TELL IT ABOUT MY CONFIGURATION X; &NXTDRV0;;STEP TO NEXT DRIVE NUMBE}R "HIDRVLP;;IF MORE, LOOK AT THEM X;& X; ZERO INITIALIZED MEMORY0 X;: INITPT2%>MAPBUFCHGMAPD A;;NOTE X=0 HERE}N ZERLP1PCHGMAP8X 1b HZERLP1l #MAP2MODv X; )X; DEFINE TOP OF FMS FOR USER PROGRAM X; QDOSEND PMEMTOP }%DOSEND X; #X; ALLOCATE FILE SECTOR BUFFERS X; !$>;;MAX OF 16 SECTOR BUFFERS &DKBFLP(FILES;;EMPTY BUFFERS DON}E? DALCBUF "BUFFLG9 GDKBFSQ ALCBUFC PSBTABU9 3 DKBFSQ0;;BUMP BUFFER COUNTER* $IDKBFLP;;IF NOT CONTINUE L}OOPING4 )'MEMTOP;;DEFINE TOP OF MEMORY USED> X;H X; SET UP HANDLER VECTORR X;\ FNDHND2f 2p 2z *QHATABS9;;END }OF THE HANDLER TABLE? !FNOHAND;;THEN INSTALL IT HERE R>D;;A 'D' ALREADY PRESENT? !HFNDHND;;NO, CONTINUE LOOKING X; }1NOHANDQ>D;;END OF TABLE OR CURRENT 'D' ENTRY PHATABS9 (Q>DKEPT;;STASH MYDOS ENTRY VECTOR PHATABS9 Q>DK }EPT "PHATABS9;;BUILD HANDLER VECTOR B!;;DUPINV (dup code modifies this) ;DONE, INITIALIZE DUP CODE X; X;'X; DO }S NON-ZERO PAGE RAM ALLOCATIONSX; CHGMAP$ CURMAP. MAP28MAP2MODB LSTSECLLSTIOCBVX;`=X;  } MYDOS FCB STRUCTURE (ALMOST THE SAME AS ATARI DOS 2.0)jX;t FCBFNO~FCBOTC;;OPEN TYPE CODE FCBFLG MAXLEN } CURLEN BUFNO CURSEC LNKSEC SECCNT*DIRBAS;;BASE ADDRESS OF CUR. SECTOR SAVSEC  }FCBLENFCBLENX;&BUFFLG;;IF 0, BUFFER NOT IN USE 6SBTABU;;UPPER BYTE OF THE SECTOR BUFFER ADDRESS(}MAPBUF;;SPACE ALLOCATED FOR VTOC7DIRBUFMAPBUF;;SPACE ALLOCATED TO READ DIRECTORIES( FNAME 2 CURMP<X;FX;}P BASE Z/HDTAB ===;;8 LOGICAL HARD DRIVES OFd) ===;;UP TO 65535 SECTORS EACHnX;xBX;this table is ref}erenced by DUP.SYS, and should not be moved!X;X;X; DOS CONFIGURATION CODEX;X;=X; CONTROL BLOCK TO BE WRITTE}N TO A DRIVE TO CONFIGURE ITX;WOTDCB N=@ DIRBUF=  =X;PX; THE CONFIGURATION CODE, FORCES A DRIVE IN}TO THE APPROPRIATE CONFIGURATIONX;"SETDRVM>?;;EXTRACT CONF. BITS PTMP1 'TMP2"% SIOV;;READ CURRENT CONFIGURATIO}N, GJSTRD6 QTMP1@ %TMP2JV?T5;;SAVE REMAINING BITS^M>;;EXTRACT STEP RATE CODEhPDIRBUFrQ>|PDIRBUF}U?'PDIRBUF;;STORE DOUBLE SIDED FLAGC;;GET DENSITYV?/PDIRBUF;;STORE UPPER BYTE OF SECTOR SIZEW?PDI}RBUF;;THEN LOWER BYTEU?T?T?PDIRBUF7V?V?!V?;;POSITION TRACK COUNT FIELD?&"QTRACKS8;;GET NUM}BER OF TRACKS0 PDIRBUF:M>;;SEE IF 77 TRACK 8 IN.D5NV?X/LDIRBUF;;MERGE D/DENSITY WITH 8 IN. FLAGbPDIRBUFl}7vT?;;CONVERT TO 0 OR 8 O>;;SECTOR COUNT = 18 OR 26PDIRBUF %DUNITQHDTAB8 FTOSIOV!PDIRBUF};;SIZE = SECTORS/TKQHDTAB8 PDIRBUF;;LOW BYTE OF SIZEQ>PDIRBUF;;ONE TRACK/DRIVE+TOSIOV#DCOMND;;CHANG}E COMMAND TO WRITEQ>"PDSTATS;;SET DIRECTION -> DISK& SIOV;;WRITE OPTION TABLE TO DRIVE X;FX; AND THIS ROUTINE} MAKES SURE IT REALLY DID HAPPEN AS WE THOUGHT! X;*JSTRDQ>RDSTAT4 PDCOMND> DSKINVH $DUNITRC\ GZERDVSf QDVS}TATpT?;;SECTOR SIZE=256?zT?T?Q>O>SETSIZPSECSIZ9:X;ZERDVSQ>FSETSIZ;;branch alwaysX};X; DOS RAMDISK CODEX;X;+X; RAM DISK I/O HANDLER (POS. IND. CODE)X; MAPAGE ===$ ===. }===8 ===BX;L ===V ===` ===j ===tX;~ === ===} ===Ϝ ===X; === === === ===X; VALSEC5CL>}V?  PBUFR=;;DISABLE INT-SQ>(PNMIEN;;DISABLE NMI-S2W?< PBUFRF7P?Z QMAPREGdL>n PCHKSUMxL>| } MMAPAGE8%PMAPREG;;SELECT RAMDISK DATA PAGEX;*QDBUFLO;;USER BUFFER ADDRESS GOES HERE PBUFRQDBUFLO P!}BUFR%>8DRREADL;;CY=0 IF READRWRITLQ@BUFR7 P@BUFR73 IRWRITL GRIOXX;")RDKIO'DAUX1;;**"}* FOR FORMAT CODE ***,)>6U?@R>J/RDKLMT ;;NUMBER OF 16K PAGES IN RAMDISKT!DVALSEC;;CALCULATE MEM. ADDR.^8h#}Q>r GRERROR|X;RREADLQ@BUFR7P@BUFR73 IRREADLX;%RIOXQCHKSUM;;FORCE REAL RAM PAGEPMAPREG;;B$}EFORE EXITINGQ>PNMIEN;;RE-ENABLE NMI.;;ENABLE INTERRUPTSQ>;;RETURN '1' IN Y-REG&RERRORPDSTATS;;AND IN ST%}ATUS BYTE$CURFCB;;RESTORE FCB ADDR?:;;THEN EXIT INTERRUPTSQ>;;RETURN '1' IN Y-REG&RERRORPDSTATS;;AND IN ST9O? $X;save#d:MDOS2.M65 MYDOS module9X; Copyright 1984, Charles Marslett, Wordmark SystemsX;(IX; Permission is gr!'}anted by the author for any use whatsoever of this2HX; code, so long as this notice remains in the source code, and so<L!(}X; long as the source to this routine, however modified or unmodified,F.X; is made available for a nominal cost.PX;Z!)}X; DISK OPEN ROUTINEdX;n'DKOPEN WBITMP;;fix that nasty bug!x( SETUP;;SET UP BUFFER POINTERS, ETC.2 GETFNM;;GET D!*}RIVE ID OR FILE NAME FROM BUFFER'QICAX1Z;;GET TYPE OF OPEN FROM IOCB PFCBOTC9!M>;;TEST DIRECTORY READ FLAG FDKOP!+}N13!LSTDIR;;IF SET, GO HANDLE DIRECTORY FORMATTINGX;DKOPN1PSAVSEC9PSAVSEC9;;ZERO SAVSEC SFDIR6;;SAVE!,} STATUS RETURNED EOPNEW*Q>;;MAKE SURE THIS IS NOT A DIRECTORY GETFLAG4HDIROPN;;IF A DIRECTORY, GO HANDLE IT SEP!-}ERATELYOPNEW%ICAX1Z")>,FOPNOP;;IF OPEN FOR OUTPUT6)>@FOPNIN;;IF OPEN FOR INPUTJ)> T+FOPNUP;;IF OPEN F!.}OR READ/WRITE (UPDATE)^)> hFOPNAP;;IF OPEN AND APPENDr.DIROPN!ERRCMD;;OTHERWISE, IT IS AN ERROR!|X;OPNAP8;;OPE!/}N APPEND EOPNCR0 TSTLOK- INITYP;;READ ALL THE SECTORS IN THE FILEQDIRBUF8 PSECCNT9QDIRBUF8PSEC!0}CNT9APPRD RDNXTS$DAPPRD;;IF NOT EOF, READ ANOTHER QMAXLEN9# LENSET;;SET LENGTHS FOR OUTPUT QSECCNT9 HS!1}GLDEC"SECCNT9/SGLDEC"SECCNT9;;ALLOW FOR SECTOR REWRITTEN& !OPOUTX0X;: OPNUP8;;OPEN UPDATE (OUTPUT)D EOPNER!2}1N TSTLOKXOPNOWR INSTRTb !DONElX;vOPNIN8;;OPEN INPUT DOPNOWROPNER1Q>;;FILE NOT FOUND GEROXITX;!3} OPNOP8;;OPEN (NORMAL) OUTPUT EOPNCR REMOVE !GET1STX;OPNCR0"FCBOTC9OPNCRQHOLFN PCURFNO GOPDIRF!4}GET1ST ALLOC X;$QICAX2Z;;IF OUTPUT, TYPE OF FILE "M>$;;SAVE LOCKED & FORMAT BITS*1N>C;;MERGE IN DEFAULT CODE (DO!5}S II, UNLOCKED)4%MAPBUF;;WHICH TYPE DISK?>)>;;IF >2 THEN MYDOSH DLLINKSRL>\X;f LLINKS5p. RDCFNO;;SELECT PR!6}OPER SECTOR IN DIRECTORYz; ENTNAME;;ENTER NAME INTO ITQLNKSEC9PDIRBUF8 QLNKSEC9PDIRBUF87 !7}SAVFLAG INITYP TONXTOPOUTXQ> PFCBFLG9! TSTDOS;;FILE NAME = DOS.SYS? HJDONE %CURSEC9QCURSEC9!8}' SETDOS;;IF SO, UPDATE BOOT SECTORS$X;. QDOSAD8 PFMSZPGB QDOSADLPFMSZPGV0HOWTDOS;;NOTE: DOS CANNOT STA!9}RT ON ZERO-PAGE`X;jOPDIRFQ>tEROXIT!AEXIT~X;3LWTDOS WRNXTS;;AUTOMATICALLY WRITE DOS.SYS OUT/OWTDOS%>;; !:}IF WE OPEN IT FOR WRITE (THIS5CDOSBFQ@FMSZPG7;; IS BECAUSE DOS 2.0 WOULD BLOW1P@FMSBPT7;; ITSELF AWAY IF A REAL WRIT!;}E FROM&3;; THE DOS CODE WAS ATTEMPTED AND1)DLINK;; WE ARE GOING TO REMAIN COMPATIBLE). DCDOSBFC PCURLEN9 !<}MVBUFR )DOSENDSDOSEND DLWTDOS JDONE!DONEX;X; READ DATA FROM A FILE(X;2/DKREAD SETUP;;SET UP BUFFE!=}R POINTERS, ETC.< QFCBOTC9F&M>;;TEST THE DIRECTORY INPUT FLAGP!FRDFILE;;SO WE CAN HANDLE THEZ.!DIRRD;; SPECIAL CASE!>} OF A DIRECTORY READdX;nRDFILEQCURLEN9x RMAXLEN9;DRDSGBT;;IF NOT AT SECTOR BOUND., READ A BYTE AT A TIME6ERDASN!?}T;;ELSE, CHECK FOR READ MODE AND BUFFER SIZEX;RDASLPQICCOMZM>4FRDSGBT;;IF NOT BINARY I/O READ A BYTE AT A TIM!@}E %DLINK1?RDSCLPQ@FMSBPT7;;SIMULATED BURST I/O (USING UNROLLED LOOP) P@ICBALZ71 Q@FMSBPT7 P@ICBALZ71!A} Q@FMSBPT7 P@ICBALZ7"1, Q@FMSBPT76 P@ICBALZ7@1J HRDSCLPT0Q@FMSBPT7;;DATA AREA IS MULTIPLE OF 4 PLUS 1^ P@!B}ICBALZ7h0 BUFADJ;;ADJUST BUFFER POINTER BY 125 OR 253r(RDASNT RDNXTS;;READ THE NEXT SECTOR|*ERETEOF;;REPORT EOF/ERROR !C}IF NECESSARYQICBLLZ;;AND REPORT LAST BYTE IF IT IS SO! ,X;&)RETEOFQ>;;RETURN END OF FILE STATUS0 !AEXIT:X;D!F}X; WRITE DATA TO A FILENX;X,DKWRITPDATBYT;;SAVE DATA BYTE (PERHAPS)b %ICDNO9l5'ICDNOZ;;INSURE ICDNOZ IS SET UP (BASI!G}C DOES NOT)v. SETUPW;;SET UP REST OF FLAGS AND POINTERS QFCBOTC9M>8FCANTWR;;ERROR OUT IF WRITE IS ILLEGAL (BASIC!H} AGAIN) QCURLEN9? RMAXLEN98DSKBURST;;SKIP AROUND IF NOT WRITING END OF A SECTORX;*WRASLP WRNXTS;;WRITE A S!I}ECTOR OF DATA,ERETEOF;;ERROR OUT IF NO MORE DISK SPACE %STKPSVQ8R>;;IF FROM BASICDBASWRT;;PASS SINGLE BY!J}TES !QFCBOTC9;;fix open for updateM>;;bug in burst I/O  HBASWRT* QICCOMZ4M>;;AND IF RECORD I/O>FBASWRT;;PAS!K}S SINGLE BYTESH0%ICBLLZ;;AND IF THE BUFFER IS < 256 BYTESRFBASWRT;;PASS SINGLE BYTES\ %MAXLEN9f1p1WRSCLPQ@ICBA!L}LZ7;;ELSE DO SIMULATED BURST I/Oz$P@FMSBPT7;;BY UNROLLING THE LOOP1 Q@ICBALZ7 P@FMSBPT71 HWRSCLP-Q@ICBALZ!M}7;;BUT ONLY 2 ENTRIES FOR WRITING P@FMSBPT7 BUFADJ Q@ICBALZ7 PDATBYT !WRASLPX;BASWRT%> SKBURSTQD!N}ATBYT #CURLEN9 P@FMSBPT7$ Q>@. :LFCBFLG9;;FOR UPDATE, SAY THE SECTOR HAS BEEN MODIFIED8 PFCBFLG9B HTODONE;;BRANC!O}H ALWAYS!L X;V CANTWR!ERRCMD` X;j BUFADJ,t QMAXLEN9~ PCURLEN9 OICBALZ PICBALZ DRBAOK #ICBALZ RBA!P}OK; QICBLLZ SMAXLEN9 PICBLLZ ERBLOK "ICBLLZ RBLOK: X; X; RETURN FILE STATUS X; .DKSTAT SETUP;;S!Q}ET UP RETURN ADDRESS, ETC. ( LFFILE;;FIND IF FILE IS THERE, ETC.(  TSTLOK;;IS IT LOCKED?2 "TODONE!DONE;;RETURN TO CALLE!R}R< X;F -X; CLOSE FILE (WRITING ANY PENDING SECTOR)P X;Z DKCLOS SETUPd QFCBOTC9n M>;;OUTPUT ALLOWED?x FCLROTC;;IF !S}NOT, JUST EXIT UFCBFLG9 DCKFLSC $ REWRIT;;REWRITE THE LAST SECTOR RRDIR QSECCNT9 %DIRDSP PDIRBUF8 Q!T}SECCNT9 PDIRBUF8 QDIRBUF8 %M>;;NOT OPEN FOR OUTPUT ANY MORE SAVFLAG QSAVSEC9 LSAVSEC9 FCLROTC!U} (LSTIOCB" FFAPPD, ' INITYP;;READ ALL THE SECTORS AGAIN6 APPLP RDNXTS@ DAPPLP;;NOT EOF YETJ ETIELNKT FAPPDQLS!V}TSEC^ PCURSEC9h QLSTSECr PCURSEC9| TIELNK, RWDISK QDLINK PCURLEN9 QSAVSEC9 %SAVSEC9 SAVL!W}NK CLROTEICLROTC "Q>;;FAILURE IS A SYSTEM ERROR !AEXIT CLROTCQ> PICHID9 Q> PFCBOTC9 !FREDON X;!X} CKFLSCUFCBFLG9& DCLROTC0 WRDISK: !CLROTED X;N INITYPQ>X GETFLAGb V?l W?v W? W? LFCBOTC9 PFCBOTC!Y}9 QDIRBUF8 PLNKSEC9 QDIRBUF8 PLNKSEC9 QCURFNO PFCBFNO9 Q> PFCBFLG9 PCURLEN9 PSECCNT9!Z} PSECCNT9 : X; X; DOS XIO ROUTINES* X;4 X;> LX; Sorry about the lack of comments in this file and some of the o![}thers,H HX; I just never had to figure this code out after I wrote it (:-)!R X;\ $NODIRFQ>;;FILE NOT A DIRECTORYf !A!\}EXITp X;z PIKDIR%> Q> : FDVND3 R@ICBALZ7 HFDVND 3 Q@ICBALZ7 R> @ DSETRDIR R> Z DGFNDIR R>!]} _ DSETRDIR R> z ESETRDIR.GFNDIR LFFILE;;FIND NEW DEFAULT DIRECTORY INITYP$ TONXDR.FNODIRF;;IF NOT A!^} DIRECTORY8QDIRBAS9B?L QDIRBAS9V-SAVDEF'CDIREC;;UPDATE ADDRESS OF DIR.` PCDIRECj QICDNOZt PDEFAULT;;UPD!_}ATE UNIT NUMBER~ ITOFDNX;SETRDIRQ>i %>i ISAVDEFX;1RENAME LFFILE;;GET OLD NAME, DRIVE, VALIDAT!`}E%> STEMPLQFNAME8PMAPBUF81 HSTEMPL+RNLOOP TSTLOK;;CANNOT RENAME IF LOCKED TDDOS;;TEST FOR D!a}OS GONE!  %TMP2 GETNAM;;GET NEW NAME,($ ENTNAME;;OVERWRITE NAME IN DIR.2& WDIRBK;;REWRITE DIRECTORY TO DISK<X;!b}F TSTDOS;;NEW NAME DOS.SYS?PHREPLDS;;NO, LOOK AT NEXTZ %DIRDSPdQDIRBUF8n5xQDIRBUF8?7& SETDOS;;!c}ELSE, UPDATE BOOT SECTORSREPLDS%> RTEMPLQMAPBUF8PFNAME81 HRTEMPL CSFDIR;;TO RENAME DRNLOOP!d} ETOFDNX;DELETE LFFILE$DELLP REMOVE;;FLUSH THE SECTORS" RRDIR;;REREAD DIRECTORY BLOCK TDDOS;;DOS.SYS DEL!e}ETED?"Q>,% SAVFLAG;;REWRITE DIRECTORY BLOCK6 CSFDIR@DDELLP;;IF ANOTHER FOUND,J)TOFDN!FREDON;;ELSE, WRAP UP AND!f} EXITTX;^0REMOVE TSTLOK;;ONCE HAD 'OPVTOC' CALL FIRSTh INITYPr TONXDR| HDELDIR CHASEX;D0C6C FREE !g}RDNXTS DD0C6C:X;'INVDELQ>;;DIRECTORY NOT DELETABLE !AEXITX; LOCKQ>  ,;;BIT ABS (SKIP 2 BYTES)!q}B%DOS SYSB*)DUP SYSBSBLURB TXTBA[BUILD M65B BUILD OBJBMDOS M65B$MDOS OBJB[MDOS1 M65B&MDOS2 M65BMDOS3 M65BGMDUP M65B9LMDUP OBJB'MDUP1 M65MDUP2 M65eTMDUP3 M65"README DOCX;UNLOCKQ> PDATBYT* LFFILE;;FIND FILE AND VERIFY WRITABLE&#LKULKLQ>;;STRIP OFF OLD BIT 50 GETFLAG:!LDATB!r}YT;;AND REPLACE WITH NEWD SAVFLAGN CSFDIRX DLKULKLb ETOFDNlX;vDELDIR%> Q> ?DELSETPFNAME 83!s} HDELSET SFDIR DINVDELX;Q> PDATBYT TONXTDELDRL FREE INCCSEC "DATBYT HDELDRL  !GETFNM!t}X; POINT%FCBFLG9* GERRCMD4X;>QICSPR9HRCURSEC9R HPNTREAD\ QICSPR9f RCURSEC9p FPNTSMEz PNTREAD!u}C!FPNTCLN;;IF SECTOR UNMODIFIED WRDISKQ> PFCBFLG9PNTCLNQICSPR9PLNKSEC9 QICSPR9 PLNKSEC9!v}" CHASE;;READ SECTOR POINTED TO EBADPNTX;PNTSMEQICSPR9 RMAXLEN9 EPNTEQLPNTLSTPCURLEN9 !DONE$X;!w}.,PNTEQLFPNTLST;;IF POINTING AT LAST BYTE8&BADPNTQ>;;INVALID POINT LOCATIONB LX;V&ERRCMDQ>;;INVALID IOCB PAR!x}AMETER` !AEXITjX;tNOTEQCURSEC9~ PICSPR9QCURSEC9PICSPR9 QCURLEN9PICSPR9 !DONEX;DKX!y}IO SETUPQICCOMZ;;GET COMMAND BYTER> FFORMATR>+EERRCMD;;IF INVALID COMMAND S>   DERRCMD? QV!z}ECTBH8(52 QVECTBL8<5F:;;VECTOR TO PROPER ROUTINEPX;Z,VECTBH RENAME =DELETE d" MKDIR =!{}LOCK n$ UNLOCK =POINT x# NOTE =DKLOAD % DKLOAD =PIKDIR !|} MKDIR X;*VECTBL RENAME =DELETE  MKDIR =LOCK " UNLOCK =POINT!}} ! NOTE =DKLOAD # DKLOAD =PIKDIR  MKDIR X;X; DOS FORMAT ROUTINESX;!~}X;6FORMAT WBITMP;;WRITE OUT ANY PENDING VTOC SECTORS%> %WOTCOPY2QWOTDCB8;;set up DCB for"PDDEVIC8;;densi!}ty stuff,16 IWOTCOPY2@ $ICDNOZJ (RAMDKUT%FWOTRAM;;don't do it for RAMdisks^%SECSIZ9hQDRVDEF9r SETDRV!};;set density|!WOTRAM$CURFCB;;restore X reg%>(C;;THEN INITIALIZE NEW BIT MAP (VTOC)CLRMAPPMAPBUF8PMAPBUF!}83)HCLRMAP;;ALLOCATING ALL POSSIBLE BITSX;Q>(PMAPBUF;;DEFINE IT AS A DOS 2.0 DISKQ> P@FMSBPT73!}=P@FMSBPT7;;PRESUME NO BAD SECTORS IF BUFFER IS UNMODIFIED %ICDNOZ )RAMDKU(FRAMFMT;;IF RAMDISK, SKIP EVERYTHING&!}QFMSBPT0(%FMSBPT;;call density junk for patch:/ BUFSET;;SET UP BUFFER POINTER FOR SIO CALLD$>N&TMP1;;ALLOW ONE!} TRY ONLYX(Q>";;PRESUME 1050 D/D FORMAT REQUESTb%ICAX2Z;;THEN GET AUX2 BYTEl(GFMTOK;;MINUS --> NO FORMAT REQUIREDv H!}NMLFMT%ICAX1Z;;(AUX2,AUX1) = 1?1.FFT1050;;YES, FORMAT WITH $22 COMMAND BYTENMLFMT$DUNITQSECSIZ9>+Q!}>FMTCMD;;AUX IS 0, must not be 1050 dd*FT1050PDAUX1;;MAKE SURE WE SECTOR > 34%DSKTIM;;DISK TIMEOUT VALUE (RETURNED IN!} STATUS)& DKFME;;ENTER DKIO AT FORMAT ENTRY#IFMTOK;;delete bad sector check*FMEXIT!AEXIT;;ELSE, RETURN ERROR CODE!}X;?RAMFMTPCURSEC9;;STUFF PROPER NUMBER OF SECTORS INTO CURSEC 3,;;(256-BYTE PAGES * 2 SINCE SECTOR SIZE IS 128) ORDK!}LMT V?* WCURSEC94,HNOTDEF;;FAIL IF NOT 256 SECTORS OR MORE>X;H8X; SUCCESSFUL FORMAT, CREATE VTOC AND EMPTY DIRECTORY!}RX;\%FMTOK%>;;check for a bad formatf Q@FMSBPT7p#M@FMSBPT7;;first two bytes $FF?zR>FFMTOK2;;yep, continue!}Q>;;otherwise format error HFMEXIT.FMTOK2 INVUNIT;;MAKE SURE WE CAN DO THIS!- DELDOS;;DELETE ANY CURRENT DOS BOO!}T FILE QICAX1Z PCURSEC9 QICAX2Z#M>;;DISK MUST HAVE 256 SECTORS&HNOTDEF;;IF SIZE SPECIFIED, USE IT %ICDNOZ!}.QHDTAB8;;IF NOT AND THIS IS A HARD DISK"PCURSEC9;;USE THE DEFINED SIZEQHDTAB8 HNOTDEF&*DVSTAT;;ELSE,!} IS IT A 1050 DRIVE?$!IFIGSIZ;;NO, FIGURE SIZE THEN.'Q>;;YES, FORCE TO 1040 SECTORS8 PCURSEC9B Q>L HNOTD!}EFVX;`FIGSIZQDRVDEF8j"M>1;;EXTRACT TRACK COUNT FLAGStV?~6V?V??0QNOSECS8;;AND USE DRIVE DEFAULT SEC!}TOR COUNT PCURSEC9QNOSECS88,DNOTDEF;;IF NOT DOUBLE SIDED, THIS IS IT TCURSEC9U?;;ELSE, DOUBLE ITX;!}NOTDEFPCURSEC9R>;;NEED 16 BIT LINKS?  DSHORTS;;NO, SHORT FORMAT OK*#MAPBUF;;YES, FORCE LONG FORMAT (DOS3),!}SHORTS FNDBIT;;FIND LAST BIT MAP SECTOR( QTMP22"HGT246;;IF PAST 256TH MAP BYTE<*DLINK;;SINGLE DENSITY?F GFDBDENP)!}>Z IFDBDENdGT246PMAP2n,xO> PMAPBUFFDBDENQ> PMAPBUF Q> 2PMAPBUF;;START WITH!} 9 FREE SECTORS UN-FREE!FLOOP FMTFRE DECCSECR>;;BOOT SECTORS YET?)HFLOOP;;IF NOT, CONTINUE DEALLOCATINGQ!}CURSEC9 HFLOOPX;Q>;;success)PFMSBPT;;bad sector code deleted hereX;Q>">PMAPBUF7;;ALLOCATE THE RO!}OT DIRECTORY AND BASE VTOC SEC.,*Q>;; NOTE: ALWAYS THE SAME 9 SECTORS6PMAPBUF8@"%>,;;START ALLOC. OF VTOC HEREJ Q!}MAPBUFT;^S>;;GET NUMBER OF SECTORSh*DLINK;;(SINGLE DENSITY?)rGMPNSD;;IF NOT, M-3|T?;;IF SO, M*2-5 MPNSD>!}0;;MOVE COUNT TO XX;ALCMPLQ> ALCMAP0 GSMBSIZ5 DECCNT7T? HALCMAPPMAPBUF 81IALCMPL;!};BRANCH ALWAYS!X;SMBSIZPMAPBUF 8&$QMAPBUF;;MARK EMPTY SIZE, TOO0PMAPBUF:QMAPBUFDPMAPBUFN !}FMTMAP;;WRITE MAP TO DISKXX;b X; CREATE AN EMPTY DIRECTORYlX;v Q>i %>i3CLRDIR SETDIR;;RESET THE DIREC!}TORY BASE SECTORC$CLRDLPPDIRBUF8;;ZERO THE BUFFER3 HCLRDLPX;Q> PDIRSEC1CLRDL2 WDIRBK;;THEN WRITE !}8 SECTORS OF ZEROS "DIRSEC ICLRDL2 %BUFNO9Q>  PBUFNO92PBUFFLG8;;DONE, SO FREE UP INTERNAL BUFFERS  QF!}MSBPT* !AEXIT4X;>"NOSECS #=(=P=MHX;RSETDIRPDIRBAS9\CfPDIRBAS9p%>z:X;X; DOS BI!}NARY LOAD CODEX;X;.X; LOAD AND EXECUTE A BINARY FILE (PROGRAM)X;DKLOADQICAX1Z-PICPTLZ;;SAVE PROGRAM NAME B!}UFFER POINTERR>#ETOERRC;;IF WRITE, REPORT ERRORX;Q>TORTS PRUNADR-Q>TORTS;;ASSUME RUN ADDRESS IS A!}BSENTPRUNADRQ>$ PICAX1Z.QICHID9;;IOCB OPEN?8 ICCFILEB DKOPEN;;IF NOT, OPEN ITL GDKLERVV WDREAD;;RE!}AD A HEADER WORD` FCCFILEj+%>;;NO $FFFF, REPORT HEADER ERROR CODEt GDKLERV~X;TOERRC%>;;INVALID IOCB:X;!}GETTXTQ>TORTS PINIADR:Q>TORTS;;FOR EACH SEGMENT, RE-FORCE NULL INIT CODEPINIADRTXTLP DKREADDK!}LERVGDKLERR%> P@ICBALZ7 #ICBALZ HDECLEN  #ICBAHZDECLENQICBLLZ HDECLOW( "ICBLHZ2DECLOW"ICBLLZ<!} HTXTLPF QICBLHZP HTXTLPZ QICBAHZdR>INIADRn HCCFILExX;QICPTLZ;;IF NO INITS,V?ECCFILE;;SKIP TO NE!}XT PAGEA;;ELSE SAVE IOCB5 %> CPSICBQICHIDZ 8$PICHID9;;SAVE 12 BYTE IOCB ENTRY23 HCPSICB!}7>5# DOINIT;;AND CALL INIT FUNCTION7">,56 %> @1CPRICBQICHID9;;THEN RESTORE THE 12 BYTE IOCBJPICH!}IDZ 8T2^3h HCPRICBr7|>X;&CCFILE WDREAD;;READ START ADDRESS FCCFILE PICBALZ 'ICBAHZ WDREAD!};;READ END ADDRESS;O> DCCSUBT3 CCSUBT;!SICBALZ;;CALCULATE THE LENGTH PICBLLZ C SICBAHZ PICBLHZ!}& 0EGETTXT;;BRANCH IF A VALID LENGTH (GET DATA)0 %%>;;ELSE, MEMORY WRAP ERROR CODE: GDKLERRD X;N WDXIT7X 7b DKLERR!}Cl 5v  DKCLOS;;CLOSE PROGRAM FILE 7 (?;;AND RETURN HIS ERROR CODE (IF ANY) : X; BX; READ A WORD FROM THE PROGRAM !}FILE AND COMPARE IT WITH $FFFF X; WDREADQ> PICBLLZ PICBLHZ;;SET LENGTH TO ZERO  DKREAD;;READ A BYTE GWDEOF!} 5  DKREAD;;READ THE SECOND! GWDEOF1 !?!7 !)>;;UPPER BYTE $FF?*!,HTORTS;;IF NOT, TOTAL VALUE IS NOT $FFFF4!%R>!};;UPPER OK, IS LOWER BYTE $FF?>!.TORTS:;;RETURN ZERO FLAG IF WORD WAS $FFFFH!X;R! WDEOF17\!#WDEOF)>;;IS THIS END OF FI!}LE?f!%HWDXIT;;IF NOT, RETURN ERROR CODEp!7z!"7;;ELSE, GET RID OF RETURN ADDR! QICPTLZ!V?!V?!6!# DKCLOS;;CLOSE FIL!}E AND SET Y=1!8!$ETORTS;;EXIT IF NO-RUN SPECIFIED!+!@RUNADR:;;OTHERWISE, GO TO RUN ADDRESS!X;!FX; INVOKE INIT FOR E!}VERY BLOCK OF INPUT CODE (USUALLY JUST AN RTS)!X;!#DOINIT!@INIADR:;;CALL INDIRECTUN ADDRESS!X;!FX; INVOKE INIT FOR E VI #X;save#d:MDOS3.M65 MYDOS moduleX;X; DOS MAKE DIRECTORY CODE(X;29X; Copyright 1984, Charles Marslett, Wordma%}rk Systems<X;FIX; Permission is granted by the author for any use whatsoever of thisPHX; code, so long as this notice%} remains in the source code, and soZLX; long as the source to this routine, however modified or unmodified,d.X; is ma%}de available for a nominal cost.nX;x-X; XIO FUNCTION TO CREATE A NEW DIRECTORYX;X; PARSE DIRECTORY NAMEX;MK%}DIR GETFNM" SFDIR;;FIND FILE IN DIRECTORY EMKDMRDQ>;;FILE ALREADY EXISTS ;;SKIP 2 BYTESDISFULQ>;;DIREC%}TORY FULL !AEXITX;X; READ IN BIT MAPX;MKDMRDQHOLFN GDISFUL RBITMP" %MAPBUF,161@ 'DATBYTJX;%}T'X; FIND EIGHT SECTORS FOR DIRECTORY^X;h3Q>q;;FIRST AVAILABLE SECTOR AFTER ROOT DIR.r PCURSEC9| Q>qPC%}URSEC9Q> PTMP1FDIRLP#TMP1" FNDLBIT;;IS THIS SECTOR FREE? EFDIR2 MMAPBUF8 DFDIR1FDIR2MMAPBUF%}8FDIR1HFDIR3 PTMP1FDIR3 INCCSEC QTMP1R> HFDIRLPX;& X; ALLOCATE THE SECTORS USED0X;:ALCDL%}P DECCSECD FNDLBITNN>X EALCPG2b MMAPBUF8l PMAPBUF8v DALCPG1ALCPG2MMAPBUF8PMAPBUF8 VMAP2MO%}DALCPG1 DECCNT "TMP1 HALCDLPX;(X; WRITE ALLOCATION MAP BACK TO DISKX; FMTMAPX;5X; ENTER NAME AN%}D TYPE INFO INTO PARENT DIRECTORYX; QHOLFN  SDIRBK;  ENTNAME*QCURSEC94PDIRBUF8> QCURSEC9HPDIR%}BUF8RQ>\PDIRBUF8fQ>pPDIRBUF8zT? SAVFLAGX;X; THEN CLEAR NEW DIRECTORYX;Q> PFMSB%}PT QCURSEC9%CURSEC9 !CLRDIRX;$X; SIMULATE OLD STYLE BIT FINDERX;FNDLBIT FNDBIT5;;SAVE MASKQ%}TMP2;;FIRST PAGE? FFNDPG0$'TMP2;;SAVE OFFSET IN PAGE. RDATBYT8 EDFEJMPB RDNXTM;;READ IN PROPER PAGEL$%TMP2;;TH%}EN RESTORE A AND Y REGSV7`!;;;SET CY (PAGE 1 BUFFER USED)j:tX;~FNDPG07;;RESTORE SAVED MASK,;;AND CLR CY (SAY PAG%}E 0):X;DFEJMP!DFERRX;DECCSECQCURSEC9 HALCPG0"CURSEC9ALCPG0"CURSEC9:X;INCCSEC#CUR%}SEC9 HDELDIN #CURSEC9 DELDIN:X;(X; DOS DIRECTORY ROUTINES2X;<X;F/X; OPEN A DIRECTORY (FOR DIRECT USER A%}CCESS)PX;ZLSTDIR%> dSAVFNBQFNAME 8n P@FMSBPT7x3 ISAVFNB) SFDIR;;FIND A MATCH IN THE DIRECTORY-E%}ENDDIR;;IF NO MORE, GO REPORT FREE SPACE1NXTDIR FMTDIR;;ELSE, FORMAT INTO TEXT STRING QCURFNO-PFCBFNO9;;SAVE FILE %}NUMBER OF ENTRY FOUNDGODONE!DONE;;AND RETURNX;1GOTEOD"DATBYT;;CONVERT EOL TO $9B (REAL EOL)PCURLEN9;;AND FINI%}SH UP HGODONEX;X;DIRRD%> | FGOTEOD%}R>;;IS THIS END OF LINE?'HGODONE;;IF NOT, CONTINUE TEXT DUMP QFCBFNO9 RCURFNO HDMSTRD (DIUNIT FDRDNRQ%}DMSTRD RRDIRDRDNRQ CSFDIR DNXTDIRX;0X; NO MORE ENTRIES, REPORT FREE SECTORS LASTX;&ENDDIR RBITMP;;READ%} THE VTOC DATA%>%'CURMAP;;FORCE A REREAD NEXT TIME&QMAPBUF0:$MAPBUF;;AND STUFF BUFFER WITH NUMBER OF FREE %}SECS.: CVTDECD$>N9FSECLQFSECM9;;FOLLOWED BY "FREE SECTORS" TEXTX P@FMSBPT7b3l2v HFSECL#FGODONE;;%}THEN LAST LINE IS DONEX;:DIREOF!RETEOF;;NO MORE LINES, RETURN E-O-F INDICATIONX;FSECM A FREE SECTORSA=X;%}/X; FORMAT A DIRECTORY ENTRY FOR BASIC, ETC.X;FMTDIR%> ;;space $DIRDSP QDIRBUF95M>  FNOTLCK %> *;%};IF SO, MARK AS LOCKED NOTLCKC %>* P@FMSBPT747>%> ;;spaceHM>R FNOTDIR\%> :f NOTDIRCp%>z P@FMSBP%}T7 CPYNAML3QDIRBUF9 P@FMSBPT72)>  DCPYNAMLX;Q> ;;space P@FMSBPT7 %DIRDSPQDIRBUF8%}$DIRBUF8!%>;;SECTOR COUNT STARTS HERE X; 8X; CONVERT A 16-BIT INTEGER TO A 4 OR 5 DIGIT NUMBER X;$ CVTDEC&T%}MP2. PTMP18 $>'B Q>'L MKDGT2V R> 0` HSKIP5j 1t SKIP5$>~ Q> MKDGT2 Q>d;;FOR SHORT%} STUFF MAKDGT Q> MAKDGT A O> 0 P@FMSBPT7 3 Q>;;TERMINATE LINE PDATBYT P@FMSBPT7 Q> $%}CURFCB PCURLEN9 :( X;2 ;;IF SUBTRAHEND < 2%}56, ZERO UPPER BYTEP MKDGT2&DIRDSPZ PDIRSECd 'DATBYTn %> 0x ; DGTLP2QTMP1 SDIRSEC > QTMP2 SDIRDSP D%}DGTXIT PTMP2 &TMP1 3 EDGTLP2 X; DGTXITC %DATBYT P@FMSBPT7 3 :" X;, @X; PARSE A FILE NAME WITH WI%}LD CARD CHARACTERS ('*' AND '?')6 X;@ GETNAM23;;look for ">" inJ Q@ICBALZ7;;the start ofT R> >;;the filename^ FGETNAM%}h 1r HGETNAM;;branch always| X; GETFNM$CURFCB %>i Q>i SETDIR 3 Q@ICBALZ7 3 R> :;;DEFAULT %}DIRECTORY? HGETNAM2 1 'TMP1 %DEFAULT 'ICDNOZ C PICDNO9 SETUPD& QCDIREC0 %CDIREC: SETDIRD %%}TMP1N X;X GETNAM$> b 3l AFTSTRQ@ICBALZ7v R> * HTSTPER Q> ? 3 QLOOPPFNAME 9 2 ITOXITC;;END OF %}EXTENSION? "PERFND(>;;END OF FILE NAME? HQLOOP;;NO MORE -?-S FAFTSTR X; TSTPERR> .;;A PERIOD? 4HTSTCHR;;IF %}NOT, CHECK FOR INDIVIDUAL CHARACTERS Q> ;;IF SO, FILL WITH SPACES 3 HPERFND X; TSTCHRR> ?* &DENDCHR;;IF < '?', %}CHECK FOR DIGIT4 1R> Z;;ELSE, UPPER CASE LETTER, '?', OR '@'?> DGOTCHRH R> _R *DENDCHR;;IF CARET, BACKSL. OR BRACKETS\%} -R> z;;LOWER CASE, ACCENT OR UNDERSCORE?f DGOTCHRp %ENDCHR(> ;;IF FIRST CHAR, ERRORz "FERRCHR;;NO BYTES IN FILE NAM%}E R> 0;;ELSE, A DIGIT? (DFILLNM;;IF NOT, THIS IS END OF NAME R> : EFILLNM X; GOTCHRPFNAME 9 3 2 G%}AFTSTR X; TOXITCQ@ICBALZ7 TSTDIRR> :;;look for MYDOS FMYDIR;;or SpartaDOSR> >;;directory separator HXITCHR%}MYDIR'TMP2$ SFDIR;;ELSE, FIND FILE.EFNER1;;NO SUCH FILE8 TONXDRB FFNER1L %TMP2V HGETNAM`'FNER1Q>;;IF N%}OT, RETURN ERROR 174j ,;;BIT ABS (SKIP 2 BYTES)tX;~ERRCHRQ> !AEXITX; FILLNM5Q> ;;spaceFILLLPPFNAM%}E 92 GFILLLP7 !TSTDIRX;7X; RETURN WITH NON-ZERO FLAG IF FILE IS A DIRECTORYX;(TONXDRQ>;;FILE %}FOUND, A DIRECTORY?  GETFLAG"FTONXIT;;IF NOT, SET ZERO FLAG4QDIRBUF8;;YES, MOVE POINTERS TO THE NEW LEVEL( PDIR%}BAS92QDIRBUF8<PDIRBAS9FQ>;;AND CLEAR ZERO FLAGP TONXIT:ZX;d8X; ENTER A NAME INTO THE DIRECTORY AT DIRBU%}F[DIRDSP]nX;x ENTNAME6$>  %DIRDSP2NAMELPQFNAME 9;;LOAD THE MASK CHARACTERR> ?'HSTORIT;;IF NOT '?'%}, SAVE IT AS IS!863DNOSTOR;;IF CY CLEAR, LEAVE CHARACTER UNCHANGED,Q> ;;ELSE, IF CY SET, CONVERT '?' TO ' 'ST%}ORITPDIRBUF8 NOSTOR32 GNAMELP8 %DIRDSPXITCHR$CURFCB":,X;6)SFDIR WBITMP;;INSURE BIT MAP IS SAFE%}@$>J &HOLFNT &CURFNO^2h &DAUX2r2| &DAUX1 $>READ &DCOMND8 SYSSET;;SET UP POINTERS, ETC. FOR A NEW DIS%}K ACCESS QICDNOZ RRAMDKU.FCSFDIR;;IF RAMDISK, FORGET DENSITY CHECK! $CURFCB;;don't read boot sec"QDIRBAS9;;if %}in subdirectories$R>i;;but allow if first read HCSFDIR- DSKINV;;ELSE, READ THE FIRST BOOT SECTOR GERRX( IN%}VUNIT;;UPDATE DRIVE CONFIGURATIONX;0CSFDIR#CURFNO;;READ NEXT 16-BYTE DIR. BLOCK QCURFNO&/ BSECDS;;CONVERT TO SECT%}OR AND DISPLACEMENT0XITCHR1EXITCHR:%HNOREAD;;IF DISP>0, PROCESS BLOCKD# RDIRBK;;IF DISP=0, READ SECTORNX;XNOREAD%}%DIRDSPb QDIRBUF8l7FFNDOLD;;ZERO IS END OF DIRECTORY (NO MORE ENTRIES)v;GFNDOLD;;NEGATIVE IS EMPTY SLOT (MAY HAVE MORE%} ENTRIES)M>;;preserve lock flag R>;;is this DOS 2.5 + file?HNOD25;;nopeQ>A;;otherwise, kludge theNDIRBUF%}8;;flag to make $42PDIRBUF8;;and save lock. NOD25M>8HCSFDIR;;IF OPEN/CREATE FILE, IT IS NOT REALLY HERE!$> %}CPNXCHQFNAME 9R> ?#FWCMTCH;;EVERYTHING MATCHES '?'RDIRBUF84HCSFDIR;;IT DOES NOT MATCH, LOOK AT THE %}NEXT ONE  WCMTCH32  GCPNXCH*,4*DXITCHR;;ENTRY FOUND, RETURN WITH CY=0>X;HFNDOLD$HOLFNR9IKPOLD;;IF AN EMPTY%} SLOT IS ALREADY FOUND, DO NOTHING\ $CURFNOf5&HOLFN;;ELSE, SAVE THE SLOT NUMBER (FIRST EMPTY!)p KPOLD>z2GCSFDIR;;IF N%}OT END OF DIRECTORY, KEEP LOOKING ERRX;5EXITCHR1;;ELSE, ENTRY NOT FOUND, RETURN WITH CY=1X;X; DOS I/O ROUTINES%}X;X;X; DISK SECTOR I/O ROUTINESX;!WRDISK;;;FMS DISK WRITE ENTRY0RWDISK%FMSBPT;;DATA SECTOR READ/WRITE ENTRY%}QFMSBPT BUFSETQCURSEC9 %CURSEC9 FMDKIO6 $DUNIT$ (RAMDKU. FRDKIO188B5LQSECSIZ9V>`7%}j !DKIOtRDKIO1!RDKIO;;was moved...~X;EXTEND ALLOC QFCBOTC9V? DREWRIT "FCBOTC9 WTRICK !WRTTST%}X;REWRIT%LNKSEC9 QLNKSEC9 SAVLNKWRTTSTGRTBADF #SECCNT9  HTONXT#SECCNT9X;($TONXTQLNKSE%}C9;;MAKE NEXT SECTOR2PCURSEC9;;NEW CURRENT SEC.<QLNKSEC9FPCURSEC9PQ>ZPLNKSEC9;;ZERO LINKdPLNKSEC9%}n(LENSETPCURLEN9;;ZERO CURRENT OFFSETxQDLINK;;GET THE LINK LOC.PMAXLEN9;;MAKE IT MAX. LEN.,;;CLEAR CY FOR LATER %}READ:X;RDNXTSQFCBFLG9 FCHASEX;WRNXTSQFCBFLG9 GEXTENDT? IRDNXTST? PFCBFLG9 WRDISK I%}RDNXTSX;"8RTBADF!HWERR;;RETURN HARDWARE ERROR CODE IF PRESENT,X;6 SAVLNK5@CJ %DLINKT P@FMSBPT7^7h3r P@%}FMSBPT7|3 QCURLEN9NOBITP@FMSBPT7 %FCBOTC9GLEN16;;16-BIT LENGTH? QFCBFNO9T?T? %DLINK L@FMSBPT7%} P@FMSBPT7LEN16!WRDISKX;WTRICKQLNKSEC9 PSAVSEC9QLNKSEC9PSAVSEC9& &LSTIOCB0 QCURSEC9: P%}LSTSECDQCURSEC9NPLSTSECX !WRDISKbX;lINSTRT INITYPvX;CHASEQLNKSEC9LLNKSEC9 FNOLINK TO%}NXT;;SET CY=0, FUNC=READ RWDISK4GRTBADF;;CANNOT READ SO BAD FILE NUMBER(ERR=164) %DLINKQFCBOTC9;;16-BIT LINK?&}L> GLNGLNK Q@FMSBPT7V?V? RFCBFNO9  HXLINKEDQ> LNGLNKM@FMSBPT7*PLNKSEC943> Q@FMSBPT7H &}PLNKSEC9R3\ Q@FMSBPT7f PMAXLEN9p DRDXIT,z:X;XLINKEDQICCOM9R>FMTCMD;;IS THIS A FORMAT? HFNOERR NO&}LINK;:X;%X; READ OR WRITE A DIRECTORY BLOCKX;RRDIRQFCBFNO9X;SDIRBKPCURFNORDCFNOQCURFNO BSECD&}SX;1RDIRBK WBITMP;;TAKE CONTROL OF SYSTEM BUFFER$,. ;;LDA # (SKIPS 1 BYTE)8 WDIRBK;B RWDBK6L$CURFCB;;PUT &}FCB NO. IN XV&&DIUNIT;;SAVE THE DIR. BUFFER IOCB` SYSSETj,t QDIRSEC~ ODIRBAS9?QDIRBAS9!O>;;MULTIPLE &}DIRS. REQ. THIS8SYSRW FMDKIO IDRDXIT3Q>;;BIT MAP R/W ERROR, RETURN SYSTEM ERR. CODE ;;SKIP 2 BYTESX;&}FNOERRQ> PDSTATS !HWERR;;FILE NUMBER MISMATCHX; +X; READ OR WRITE THE DISK VTOC (BIT MAP)X;RBITMPQCURMA&}P( RICDNOZ2.FMAPXIT;;IF WE READ WHAT IS ALREADY THERE!<9 WBITMP;;ELSE, REAL I/O, SAVE CURRENT BUFFER CONTENTSFX;PQ>&}Z?d'ZMAPPMAPBUF8;;THEN ZERO ENTIRE 512n#PMAPBUF8;;BYTES OF MAP BUF.x1 HZMAP,4 RWBMAP;;THEN READ 128 O& }R 256 BYTES OF VTOC DATAX;%>8'DIUNIT;;INDICATE MAP IS LOADED (NOT DIRECTORY DATA)1'MAP2;;INDICATE NO DATA IN SE& }COND PAGE OF MAP3&'CHGMAP;;INDICATE MAP IS UNCHANGED3 'MAP2MOD 'CURMPX;8MAPCLRPCURMAP;;AND SAVE DRIVE N& }UMBER MAP APPLIES TO MAPXIT:X;"WBITMPQCHGMAP,0FMAPCLR;;IF MAP NOT CHANGED, SKIP WRITING IT6 PDUNIT@FMTMAPQ>& }J!PCHGMAP;;ELSE, MARK IT UNUSEDT PCURMAP^QDUNIT;;save drive #h5r ;;;SET CY TO INDICATE A WRITE|3 RWBMAP;;AND CAL& }L THE READ/WRITE SECTOR ROUTINE7;;restore drive # PDUNITX;WRNXTMQMAP2MOD)HNOMAPI2;;IF THE PAGE BUFFER IS CLE&}ANQ>;;JUST EXIT, ELSE5 QMAP2 #MAP2MOD;)EMUSTWM;;WRITE IT TO DISK (CY IS SET)X;9RDNXTMRMAP2;;READ A&} PAGE INTO THE SECOND PAGE BUFFER.FNOMAPI;;IF IT IS ALREADY THERE, JUST EXIT54 WRNXTM;;ELSE, WRITE CURRENT PAGE (IF &}NECESSARY)&7;; AND READ IN THE NEW ONE05:.,;; BY FALLING INTO MUSTWM WITH CY CLEAREDDX;N MUSTWM5XQ>MAPBUF &}b%>MAPBUF l3 BUFSET;;SET UP BUFFER POINTERS FOR SECOND PAGEv7;; OF VTOC BUFFER# MAPIOC;;ISSUE I/O OPER&}ATION(S)77PMAP2;;UPDATE ID FOR CONTENTS OF SECOND PAGE BUFFER NOMAPI:X;9RWBMAP SYSSET;;SET UP BUFFER POINTERS&} FOR SYSTEM I/OQ> MAPIOC65$QSECSIZ9>7(>;;256 BYTE SECS?  FMAPDDS-T?;;128, CHANGE PAGE &}NUMBER TO PAIR NUMBER MAPDDSN>*;4 O>h>?H!(>;;128 OR 256 BYTE SECTORS?R2FDDMAPX;;IF 128, READ 2 SECTORS TO&} FILL BUFFER\ Q>hf8p6z& SYSRW;;READ OR WRITE FIRST SECTOR QMAPBUF.R>;;IF DOS 2.0 DISK, ONLY ONE SECTOR EV&}EN!DXITMBF;; IN SINGLE DENSITY! STEPBP1DDMAPXQ>h86/ SYSRW;;READ OR WRITE SECOND OR ONLY SECTOR&} XITMBF8NOMAPI2QICDNOZ.PDUNIT;;RESTORE USER DRIVE NUMBER TO DUNIT0:;;SINCE THIS MAY HAVE BEEN ON ANOTHER DRIVE!&}X;/SYSSETQ>MAPBUF;;SET UP BUFFER POINTERS%>MAPBUF$ !BUFSET.X;8EX; ROUTINE TO STEP TO THE NEXT DIRECTORY&} ENTRY (UNTIL WE RUN OUT)BX;LBSECDS%>V 'DIRDSP`V?j WDIRDSPtV?~ WDIRDSPV?9WDIRDSP;;(FILE NUMBER MOD 8) &}* 16 IS OFFSET IN SECTOR+PDIRSEC;;FILE NUMBER/8 IS SECTOR OFFSETX;R>;;END OF DIRECTORY?16EBSECXT;;IF SO, RET&}URN CARRY SET (VALUES ARE BAD!)3WDIRDSP;;FINAL SHIFT SO NUMBER IS *16 (NOT *32) BSECXT:X;X; DOS ALLOCATION ROUTIN&}ESX;X; !X; FREE A SECTOR FOR LATER USEX;1FREE RBITMP;;MAKE SURE WE HAVE THE RIGHT MAP( PCHGMAP29FMTFRE#MAP&}BUF;;BUMP LOW BYTE OF FREE SECTOR COUNT<HFREE0;;IF NO CARRYF#MAPBUFPFREE0 FNDBITZ5d QTMP2n FSBMP1x 'T&}MP2RCURMP;;BEFORE FIRST HOLE?ESBMP2;;NO, LEAVE UNCHANGEDPCURMP;;YES, NEW FIRST HOLESBMP2 RDNXTM %TMP2"V&}MAP2MOD;;MARK MAP PAGE2 DIRTY7LMAPBUF8PMAPBUF8:X; SBMP17 LMAPBUF8 PMAPBUF8:X;"3X; F& }IND BIT ASSOCIATED WITH A SECTOR ON THE DISK,X;6FNDBITQCURSEC9@M>;;EXTRACT THE BIT NUMBERJ?T;^Q>h.FREE1W?&!};;POSITION CARRY TO THE BIT TO FLIPr1| IFREE15;;SAVE THE BIT MASKX; QCURSEC9,$O> ;;ALLOW FOR 10 BYTE HE&"}ADER?;;SAVE LOW BYTEQCURSEC9O>;;PROPOGATE CARRYW?;;fix 65535 sector bug PTMP2CW? VTMP2 W? V&#}TMP2 W?& ?0 X;: 7;;RESTORE THE BIT MASKD :N X;X )X; ALLOCATE AN UNUSED SECTOR TO A FILEb X;l ALLOC RBITMPv PCHG&$}MAP %> Q> PTMP2 !ALL1RMAPBUF8;;ANY BITS LEFT? HSECFN1;;IF SO 3 HALL1 X; ; QMAPBUF SCURMP ;&%} S>! PTMP1 !ALLCKGALGONE! QCURMP ! PTMP2*! RDNXTM4!Q>>!?H!ALL2RMAPBUF8R!1HSECFN2;;IF FREE SECTOR IN &&}SECOND PART OF MAP\!3f! HALL2p!%#CURMP;;TO NEXT SECTOR OF BIT MAPz! "TMP1! IALLCK!X;!ALGONE"CURMP!#DFERRQ>;;D&'}ISK FULL ERROR CODE!%!AEXIT;;IF THIS IS IT, ERROR-EXIT!X;! SECFN1;!$>;;I.E., -8*10 - 1! ALL3W?!2! RMAPBUF8! &(}DALL4!," HALL3"ALL4NMAPBUF8" PMAPBUF8$" IALL7."X;8" SECFN2;B"$>;;I.E., -8*10 - 1L" ALL5W?V"2`"RMAPBUF&)}8j" DALL6t",~" HALL5"ALL6VMAP2MOD"NMAPBUF8"PMAPBUF8"X;" ALL7C"T?" UTMP2"T?" UTMP2"T?" U&*}TMP2" PTMP1#A # OTMP1# $CURFCB# PLNKSEC9(# QTMP22#O><#PLNKSEC9F#DECCNTQMAPBUFP# HNOBORZ#"MAPBUF&+}d#NOBOR"MAPBUFn#,x#:#X;#X; DOS MISC. SUBROUTINES#X;#X;#%X; SET UP STATE VARIABLES ON ENTRY#X;#SETUP%IC&,}DNOZ;;GET UNIT NO.#SETUPW&CURFCB#@#2#2#1&STKPSV;;SAVE POINTER TO RETURN ADDR ON STACK#'SETUPD'DUNIT;;COPY UNIT&-} NO. TO DCB$Q>$ )RAMDKU$4FUFIXED;;RAMDISK SECTOR SIZE IS ALWAYS 128 BYTES"$QSECSIZ8,$9FINVUNIT;;IF NOT VALID UN&.}IT, TEST FOR CURRENT DENSITY6$@UFIXEDPSECDAT;;OTHERWISE, STORE CORRECT DENSITY INFORMATION@$V?J$W?T$W?^$4L>};;AND UPDAT&/}E LINK POSITION IN THE DISK SECTORh$ PDLINKr$X;|$ $CURFCB$"%BUFNO9;;GET THE BUFFER NUMBER$ HRSETUP$#%FILES;;IF ONE I&0}S NOT ALLOCATED$3$ SFORB1$6FNOSECB;;ALLOCATE ONE, OR ABORT THE OPERATION NOW!$QBUFFLG8$ HSFORB$Q>$PBUFFL&1}G8$C$ PBUFNO9$RSETUPQDOSEND;;==SBTABL%3PFMSBPT;;STORE THE BUFFER POINTER FOR THIS FILE%4QSBTABU8;; IN THE &2}ZERO PAGE POINTER "FMSBPT"%PFMSBPT&%:0%X;:%(INVUNIT JSTRD;;TEST FOR DRIVE STATED%5HUFIXED;;IF IT IS ACCESSABLE, RE&3}TURN REAL DENSITYN%X;X%0NOUNITQ>;;RETURN ST=160, DRIVE NOT PRESENTb% ;;SKIP TO JMP INSTRUCTIONl%3NOSECBQ>;;RETURN S&4}T=161, NO MORE FILE BUFFERSv% !AEXIT%X;%+X; REMOVE DOS POINTER FROM BOOT SECTORS%X;%'TDDOS TSTDOS;;MUST WE UPDATE B&5}OOT?%HTDEXIT;;NO, RETURN%1DELDOS%>;;YES, REMOVE DOS POINTER FROM BOOT% FUPDBT%X;%&X; ADD DOS POINTER TO BOOT SEC&6}TORS%X;%SETDOS'DOSLOC%PDOSLOC% %SECDAT&UPDBTQDUNIT & RRAMDKU& FTDEXIT & 'SECDAT*& QDEFAULT4&5>&%>H&7}& QFCBOTC9R&GNOAND;;LONG LENGTH FIELD?\&!%>;;IF NOT, USE ONLY 10 BITSf&NOAND'ANDCDp&Q>BOOTFLz&%>BOOTFL&8}& BUFSET&%>& 'DAUX2& D12303& 'DAUX1&$>& &DEFAULT&;& DKIO2& STEPBP& )BOOTL& HD1230&7' PDEFAU&9}LT' %ICDNOZ' 'DUNIT$'QSECSIZ8.' PSECDAT8':B'X;L'STEPBPQDBUFLOV'N>`' PDBUFLOj' GTSTEODt' #DBUFHI~'X;'&:}TSTEOD%DAUX1':'X;'%X; TEST FOR FILE NAME = 'DOS.SYS''X;'TSTDOS%> ' $DIRDSP'TDLOOPQDIRBUF9'NDOSSY&;}S 8' HTDEXIT'2'3( HTDLOOP (TDEXIT$CURFCB(?(:((X;2(DOSSYS ADOS SYSA<(X;F(1X; FIND AT LEAST ONE &<}FILE MATCHING GIVEN NAMEP(X;Z(1LFFILE GETFNM;;EXTRACT FILE NAME FROM BUFFERd('TMP2;;SAVE IT FOR -RENAME-n(+ SFDIR;;FIND&=} FIRST MATCHING FILE IN DIRx("Q>;;IF NONE, RETURN ERROR 170(EAEXIT;;ELSE, RETURN(:(X;(%X; RETURN ERROR IF FILE IS &>}LOCKED(X;(TSTLOKQ> ;;CHECK BIT 5( GETFLAG( FTDEXIT( Q>;;FILE LOCKED ERROR = 167( ;;SKIP 2 BYTES(X;(X; &?}RETURN WITH NO ERROR(X;)DONEQ>;;NORMAL COMPLETION)X;)-X; RETURN ERROR CODE IN ACC TO CIO (IN Y)")X;,)(AEXIT$STK&@}PSV;;RESTORE STACK POINTER6)B@))$CURFCB;;RESTORE IOCB OFFSET TO X-REGJ)"PICSTA9;;RETURN STATUS IN IOCBT)?;;RETURN STATUS &A}IN Y-REG^)&QDATBYT;;POSSIBLY RETURN DATA HEREh)")>;;SET CY FLAG APPROPRIATELYr):|)X;)$X; RETURN HARDWARE ERRORS TO CIO&B})X;)$HWERRQ>;;fix VTOC updating bug) PCURMAP) PCHGMAP)*QDSTATS;;LOAD REAL DISK I/O ERROR CODE)'HAEXIT;;AND RETU&C}RN IT TO THE CALLER)X;)-X; RELEASE FCB AND RETURN NO-ERROR STATUS)X;)FREDON$CURFCB)7%BUFNO9;;FINISHED WITH THE SE&D}CTOR BUFFER, RETURN IT)&FDONE;;IF NONE ALLOCATED, SO WHAT!*Q>*4PBUFNO9;;OTHERWISE, IT'S NOT ALLOCATED ANY MORE!*PB&E}UFFLG8&* FDONE0*X;:*+X; TEST OR CLEAR A BIT IN THE FLAG BYTED*X;N*GETFLAG%DIRDSPX* MDIRBUF8b*:l*X;v*1X; SAVE FL&F}AG BYTE AND WRITE BACK TO DIRECTORY*X;*SAVFLAG%DIRDSP* PDIRBUF8* !WDIRBK*X;DSPX* MDIRBUF8b*:l*X;v*1X; SAVE FL$W "X;save#d:MDUP.M65 MYDOS moduleLISTFLG2LISTFLG2(EI2<#X;save#d6:MDUP.M65 MYDOS moduleFAMYDOS*H} UTILITIES PROGRAMAPX;ZRDCONF ;;patch into RDdMAPAGE ;;handler in DOSnRDKLMT: x RDAD1 RDAD2 *I} RDAD3L NMLMAP X;*ORIGIN;;FIRST BYTE AFTER MDOS CODEX;>D:MDUP1.M65"X; resident portion of DUP c*J}ode>D:MDUP2.M65>D:MDUP3.M65X; DUPEND DUPLENDUPENDDUPBASEMSLENDUPENDMSBASEX;" ME*K}NUSL>D:MDUP2.M65>D:MDUP3.M65X; DUPEND DUPLENDUPENDDUPBASEMSLENDUPENDMSBASEX;" ME(  ^`L H  ,- '0 l , BLVDE`D1:AUTORUN.SYS8hhJ ȱ.M}HȱIȱBȱDȱEeeHHLV)  1*  ,,p-  0 I &  '.N}0   Lw)l, 0  I&LD1:MEM.SAVE:D1:DUP.SYSJ)E*D1:DOS.SYS n  * \.O}*`آ R'S )ɀ@  U))% BError loading MEM.SAV or memory!  0* b*.P}c*d*e* R Hd*JSDd*J-=e* 0c*ʈд =}MYDOS 4.50 -- CF*A+opyright 1988,˛Disks 1S .Q} 2S 3S 4S 5S 6S 7S 8S D: = D1: ~= =1-8.Dir of D1:-D8: *. Dir of D:A. Disk Directory K. Save MemoryB. Run Ca.R}rtridge L. Load MemoryC. Copy File(s) M. Run at AddressD. Delete File(s) N. Load MEM.SAB+=,VE. Rename File(s) O. Ch.S}ange Config.F. Lock File(s) P. Set DensityG. Unlock File(s) Q. Make DirectoryH. Write DOS Files R. Pick DirectoryI. I.T}nitialize Disk S. Set RAMdisk #J. Duplicate Disk V. Set Verify Flag  ?莼( 0 >,9- =Select Item (.U} for menu):@  =ɛL)1L,*L,:W@ ,,L=No such item!L*, -L*, BNeed new file name! BNo drive or directories allowed in new name!Lo.X}ck Unlock Delete Lock which file?â-#Unlock which file?ɢ-$((H @ AQ/wDelete what file?6.1/Ѣ-!.Y}((H @ ANJ =Answer 'Y' or 'N'h `B L?;(( ~=( ~= =? =Y ?Lj.H @ AhR ?R)L*,LM/L-Lz-File .Z}to rename, new name? @ A(9', ȱ:>0{ ПFull directory name?Z"L.Directory to be used a2/-0s .[}'D:'? @ A(5)L.(I: ȱޝL*, BInvalid directory!L?( (0Li-File sour.\}ce, destination? '( @C۩2ڭ82ܭC B9'0 @(ߍeލd(DЍ( ? 9' A rBȱޙ'.]}.0)1:>Ȍ(C0J* .B :'ȱ/.* #,ɛȝ:' ߰ A L?,(0L*, 'ut(:'.^}3?&' .'Ƚ:'?&'  .ى'Q?''(#( ~= =-->' ~=Q =YR_o._} (*1%2J(  0?B݌''BK)`''utz0( >(L0L*,L?nDisk to FORMAT: YA B(U.`}Tލ1 =(Press for Enhanced Dns)Type to Format Drive 0: =AIYZNj[R VL?L*,D1:DUP.S.a}YSDrive to &2!3write DOS files to? YAH1:*K)2J) Z wB hpJ) 2<2UTC.b}1ة۩کL;Source, Destination (Sectors)? YA)((9'( SA)((((( @(0% =Insert both d.c}isks, type "34 = A( A((/( B(( BDrives not compatible!J(j(9'Hi''h.d}(ɛy BInvalid options! @-&& @)׍&&(&&&۩ک&&&&8* <4&&&& <48*.e}8(ܭ(ݥ452C, BNot enough memory! ک&&`(Mh  & =L?&i &.f}&&&mm   =  &((&թԥԍ(Ս(((( ( ((C2((.g}ՠԍ((,(0"( (56( =m(m( & &("L*,  ( AL4,(, =Insert.h} DESTINATION disk, press =Nͼ J) b( 0K) ?((ԭ(խ( ( (((L4Drive, new dens.i}ity: YA9'ɛ BDrive unchanged.67(ު90٨Ȍ(SD  ABL)xԌҭHӭ@ @ ʎӆ.j}@ӭ@@ :  $ӹ @hөԥX` Aˠ =RAM disk present? =NL#8.k} =xlon or E type RAMdisk? =A7 8ό  L   M A, A6: ' =No extra memory available!L#8L7.l} & & & =Use default config for 0)ȩ ~= =K? =NL7 =Size(K)? ? @FjFjFjFj:.m} =Page sequence? ? @o* =RAM disk drive8 9 no? = 09) `8 -8**H***) 9 Ȋ)h9.n} @@ʊ H'h(#''/'(ɛ ? @(@: 3 ʽ' L7 =Duplicated sequence number!.o}L7 =Wrong number of entries!L7K 9:큅쀄 =Verify .p}WRITEs? ; =Number of File Buffers? ? @  6 Lw),R( ';L*,Drive number or : =ɛLC99L60.q}Ȍ( =Remove drive? =Y =Is drive configurable?:; =YЂ =High capacity drive? =Yy =Is drive double side.r}d? =Y ; =Tracks/side? ? @#0M P( ; =Step rate? =4/ ; ';L*, =Drive size (in sectors)?.s} ? @H(h *;L*,RAM disk drive no? 8L*,Verify WR;6;ITEs? ;L*, =WNPy`(`(  LAB7;.t}2ess? ?ɛ @ BAddress must be 1-4 hex digits! BHILV n=`hh =.y}HH` =0{a Hɛ n= n=h` n=L*, = = pHH =hh`K: p `(((( i ɀ((L?(`.z}(B'(0+>&?!HH''^>I^>(`^>DH(`(HI`(o5 ~= =( B( >@.{}A (J wB0x((HHIIDDEE B ?(CɈK(٢A ~= =( BL>(B^>((ڤ ܝHݝI .|}VL_>L?(" '?"@B !B J)  B(L& R XY( ?&:0H&((& .}} ( .( & ( .(ʩ(`ލD&ߍEBIʎH( V0`ԩ ؠ@ȱ@ȱ)@ .~}BError -- 000&`$8f#@A 3AԄձG/ $<68i/(Ԧ`H&եԦ&&eԅheԅԊe(iL*@&&.}&&ԅL*@B ? 3A?*(ɛ:./2SX(0ȱ/.ɛ(ލ9'ި.}0#:Ȱ :ފ :ȱAB: : CAD CAޥ`(eޅީe߅`(` @L\A @TUȪ: BFile .}name not allowed!: )  i( =0+L TUD BNot a disk file!(0` =Insert SOURCE disk, press .} =,(pӮ(A(O BC 1B AB1B ` % 1(L/ b(de.} BJKO L?O` B((*(((`ȱޙ((:>Ȍ(`D:`OS.SYS,DOS.SYShh =L*, .} VLJ C C,pLiLF#ԽC1C٩Յ׆  LB`*,>Ȍ(`D:`OS.SYS,DOS.SYShh =L*, ,S #X;save#d:MDUP1.M65 MYDOS module9X; Copyright 1984, Charles Marslett, Wordmark SystemsX;(IX; Permission is gra2}nted by the author for any use whatsoever of this2HX; code, so long as this notice remains in the source code, and so<LX2}; long as the source to this routine, however modified or unmodified,F.X; is made available for a nominal cost.PX;Z2}X; DEFINED VALUESdX;n CRx EOFX; OPEN GETREC GETCHR PUTCHR CLOSE RENAME 2}DELETE! LOCK# UNLOCK$ FORMATX;X; ROM AND RAM ADDRESSESX;CARTSTX;" AUDF1,AUDCT2}L6 SKRES @ SERIN JSEROUT T IRQEN^ SKCTLh PBCTLrX;|FASCII؆ IFPِEDITRV2} DSKIOS CIOVV SIOVYSETVBV\CIOINVnX; WARMST DOSVEC  DOSINI  POKMSK2} BRKKEY RAMLOX; DUNITZ!& DCMDZ"0 DBUFZ$: DLENZ(D DAUX1Z*N DAUX2Z+X DAUX3Z,bX;l2} LMARGNRv RMARGNSX; FR0Ԕ VECTORԞ HDBUF֨ BUFADڲ BUFLENܼ FNPTR TEMP TEMP22}X; INBUFFX;VSERIN VIMIRQ CDTMV3CDTMF3* SHFLOK* RUNAD4INITAD>ME2}MTOPH MEMLOR$DVSTAT;;SYSTEM STATUS BUFFER\X;fDDEVICp DUNITz DCMD DSTAT DBUF2}DTIMEO DLEN DAUX HATABSX; IOCB@ ICDNOA ICMDB ISTATC IBUFD I2}LENH IAUXJX;X; FMS ENTRY POINTS$X;. FILES 8(RAMDKU ;;LOC OF RAM DISK DRIVE NOBDFUNIT L BSI2}ORiV WRCMDy`DKTYPEjDRVDEFtFMINIT~ HDTAB  STATEMDINITWOTDCB% 1CONFIG2}R/ ;;CONFIGURE DRIVE SUBROUTINE ENTRYMAPBUF X; X;OTHERS IN THE MDUP.M65 FILEX;X; ! RESEND;;START2} OF FREE MEMORYX;^;;patch into dos here !INIT;;DUP INIT ENTRY POINTX;X; PROGRAM AREA(X;2 ORIGIN<X;F2} X; INITIALIZE MYDOS INTERFACEPX;ZINITQ>DUPENTdPDOSVECnQ>DUPENTx PDOSVECX;Q> PFNAMEQ> 2} *STATE/HCKMDOS;;IF WARM START CHECK FOR DUP LOADEDX;X; COLD START CODEX;!PSTATE;;SET MODE TO WARMSTART$2}> SOPEN;;RUN AUTORUN.SYS FILE  ' AFN GCLOSX" CLOSX, !@RUNAD:6X;@X; CLOSE IOCBS 10 AND 20JX;T2}CLOSX CLOS20^CLOS10$>;;CLOSE IOCB 10h ,;;SKIP 2 BYTESrCLOS20$> ;;CLOSE IOCB 20|!CLOS2Q>CLOSE;;CLOSE ANY IO2}CBSCMDPICMD9 !CIOVX;DBUF10$>DEFBUFPIBUF9C PIBUF9 CKMDOS:X;AFN AD1:AUTORUN.SYSA=2}CX; Moved AUTORUN FN so SUPERARC will not think this is >=4.3 DOSX;X; OPEN FILEX;X; CALLING SEQUENCE:X; JSR2} SOPEN&X; DB AUX0X; DB CMD:X; DW BUFFER ADDRESSDX;N SOPEN;X ;;LDA #IMM OPCODEbX;l&X; DO A READ/W2}RITE TYPE I/O REQUESTvX;X; CALLING SEQUENCE:X; JSR DOIOX; DB IOCBNOX; DW BUFFER LENGTHX; DB C2}MDX; DW BUFFER ADDRESSX; DOIO,7 PRAMLO7 PRAMLO%> Q@RAMLO7  DDOIO1 PIAUX9  EXTRCB*2} DOIO1>43> Q@RAMLO7H PILEN9R3\ Q@RAMLO7f PILEN9p XTRCB3z Q@RAMLO7 PICMD93 Q@RAMLO7 PIBUF932} Q@RAMLO7 PIBUF9C, ORAMLO?Q> ORAMLO 5 C 5$ !CIOV;;DO I/O REQUEST. X;8 (X; IF NO DUP.2}SYS, INCREMENT DRIVE NO.B X;L RETRYOS#DUPSYSV QDUPSYS` M>j R> t DRTYOSV~ HGOTO1 RRAMDKU FRTYOSV 2}GOTO1Q> 1 PDUPSYS RTYOSV> QDKTYPE 19 FRETRYOS HNOWMS X; X; LOAD PROGRAM FUNCTION X; LDFILE LDME2}M $> % TOVECT;;LOAD PROGRAM OR GO TO IT  ,;;skip the LDY #1 X;( *X;*************************************2 X;< (X;2} STANDARD EXIT POINT FOR PROGRAMSF X;P *X;*************************************Z X;d !X; RESTORE DOS/DUP INIT VECTORn X;2}x DUPENT%> SAVERR'CBSAV *STATE KGODOS INOWMS CLOS10 SOPEN  ;;WRITE MEM.SAV FILE OPEN NMS2}AV GNOWMS DOIO   MSLEN PUTCHR MSBASE NOWMS CLOS10" # SOPEN;;GET DUP.SYS INTO MEMORY,  6  '@ 2} DUPSYSJ GRETRYOST QDOSINI^ PINISAVh QDOSINIr PINISAV| GODOS CLOSX !DOSOS;;THEN START IT UP X; X;2} X; RUN AT ADDRESS X; )TOVECT!@VECTOR:;;TO 'RUN AT' ADDRESS X; X; LOAD MEM.SAV IF NEED BE X; LDMEM*STATE;;LO2}AD MEM.SAV? INOLDMS X; $>  SOPEN   OPEN& NMSAV0 GNOLDMS: X;D DOION   X MSLENb GETCHRl 2}MSBASEv X; NOLDMS!CLOS20 X; NMSAV AD1:MEM.SAVA= EC AE:A DUPSYS AD1:DUP.SYSA= OPT  "DUPFLAG ;2};DUP RESIDENT = $80 INISAV FMINIT +CBSAV ;;ERROR CODE FROM PROG EXECUTED FNAME  !';;ALLOW FOR 40 CHAR DEF DIR2} X; (RESEND;;ALLOW FOR 3 FILE BUFFERS +DRIVERS;;ALLOW 2K FOR RESIDENT CODE MSBASE  X; FOR 40 CHAR DEF DIR0iQ #X;SAVE#D:MDUP2.M65 MYDOS module9X; Copyright 1984, Charles Marslett, Wordmark SystemsX;(IX; Permission is gra6}nted by the author for any use whatsoever of this2HX; code, so long as this notice remains in the source code, and so<LX6}; long as the source to this routine, however modified or unmodified,F.X; is made available for a nominal cost.PX;Z6}KX;======================================================================dX;n-X; START OF NONRESIDENT PORTION OF DUP.SYSx6}X;.DATAP;;ALLOCATE BUFFER FOR BIT MAP, ETC. DELIM!PAR2P;;another bug fixed RP PAR3PX; DATA6} UNNO PTR PTRSAV IPTR IPSAV CBYTE SECTOR CSRC CDES CPYTYP" SWPFLG6}, RCNT6 SECSIZ@ FNPTJ FNPT2T!PARP;;REAL PARAMETER (LAST)^ DUPBASE hDOSSYS AD1:DOS.SYSA=r6}X;|2X; CLOSE (BRUTALLY) ALL IOCBS AND REOPEN SCREENX;INITIO CIOINV$>" SOPEN;;OPEN SCREEN AS IOCB #0  6} OPEN EC&CDTMV3;;CLEAR TIMER #3&CDTMV3%>Q>$PCDTMF3;;SET TIMER NOT DONE FLAG SETVBVWAITI6}MQCDTMF3;;DONE?!HWAITIM;;NO, CONTINUE LOOPING:&X;0 X; DISK UTILITY PROGRAM ENTRY:X;D DOSOS,N-X$>b&BRKK6}EY;;ENABLE BREAK KEYlX;vQ>MDINITPDOSINIQ>MDINIT PDOSINIX;Q>PLMARGN;;SET MARGINSQ>'6} PRMARGN QDUPFLAG LSTATEM>R> HNOSWF PWARMST  NOSWFQ>@ LSTATE !PSTATE;;ELSE, SAY IT WAS DONE*6}Q>4 LPOKMSK>#PPOKMSK;;ALLOW BREAK INTERRUPTSH PIRQENR INITIO;;CLOSE ALL FILES\X;f QSTATEpM>z FSHMEN+ 6}ERRXIT;;MEM.SAV ERROR CAN NOW BE SHOWN- AError loading MEM.SAV or memory!A==X;SHMENQDFUNITL> 0 PDEFAULT6}$>%>DKSLPQ> ;;spacePD1STAT9 PD1STAT9PD1STAT9PD1STAT9 )RAMDKUHCKHCD;;IF NOT RAM 6}DISKQ> R$ HSETUNI.X;8CKHCDQHDTAB8BFGENDCD;;IF NOT HARD DISKLQ> HVSETUNIPD1STAT9` HDKUNINjX;t6}GENDCDQDKTYPE8~ FNXTDKSV?;;DOUBLE DENSITY?Q> SEDKSNGD;;NO, SINGLEQ> D;;YES, DOUBLEDKSNGDPD1STAT6}9QDRVDEF8V?Q> - DDKSSDQ> =DKSSDPD1STAT9 DKUNINCL> 0  PD1STAT9 NXTDKS00(020<1F6} HDKSLPP PRINTZ };;CLEAR SCREENd, AMYDOS 4.50 -- Copyright 1988,An =ADisks Ax0D1STAT A1S 2S 3S 4S6} 5S 6S 7S 8S A= AD: = DADEFAULT A1:A=Q>FNAME$>FNAME PRTMSGX; PRINT =) A16}-8.Dir of D1:-D8: *. Dir of D:A=+ AA. Disk Directory K. Save MemoryA=+ AB. Run Cartridge L. Load MemoryA=. A6}C. Copy File(s) M. Run at AddressA=, AD. Delete File(s) N. Load MEM.SAVA=. AE. Rename File(s) O. Change Confi6}g.A=+ AF. Lock File(s) P. Set DensityA=. AG. Unlock File(s) Q. Make DirectoryA=". AH. Write DOS Files R. Pi6}ck DirectoryA=,- AI. Initialize Disk S. Set RAMdisk #A=6/ AJ. Duplicate Disk V. Set Verify FlagA=@ A A==J 6}%CBSAVT IMENUSL^% CIOER1;;IF LOAD ERROR, REPORT IThX;rX; SELECT MENU FUNCTION|X;MENUSL$>B2&OPT;;OP6}T=00 IF NO OPTIONS &SWPFLG)&CBSAV;;FOR DIR SCANS, SKIP NO EXTNS.! CLOSX;;CLOSE IOCBs 10 AND 20$>0 CLOS2;;AND6} IOCB 30 PRINT( ASelect Item ( for menu):A=Q>@;;FORCE UPPER CASE PSHFLOK LSTATE!PSTATE;;SAY DUP.S6}YS IN MEMORY CHRGET&R>0 HCKITEM: !SHMENDX;NCKFDIRR> 1X DCKFDDb !FASTDIRl CKFDDR> *v HBADITM !FAST6}DDX;CKITEMR> 9 DCKFDIRR> ANFUNC EBADITM S> A EITEMVBADITMQ>NFUNC ITEMVT?? QDUPJT86} PRAMLOQDUPJT8  PRAMLO+!PRTMEN;;GO TO MENU EXIT (WITH MESSAGE) X;* TCOMND 4 UCOMND >NSI ANo such6} item!A==H !MENUSLRX;\DUPJT DIRLST=STCARf CPYFIL=DELFILp RENFIL=LKFILz ULKFIL=W6}BOOT FMTDSK=DUPDSK SAVFIL=LDFIL BRUN=MEMSAV CONFGR=CHDISK MKDIR=SETDIR6} RAMDRV=TCOMND UCOMND=VERIFYNFUNC DUPJT  NSIX;%X; * AND 1-8. FAST DIRECTORY 6}LISTX;FASTDDPPAR Q> : PPAR HDOFDD$ X;. FASTDIRPPAR8 Q> :B PPARL DOFDDQ> *V PPAR` P6}PARj Q> Dt PPAR~ Q> 'PPAR;;fix the 174 errors in menu PCPYTYP PDELIM HDODIRL X; X; A. DIRECTORY 6}LIST X; /DIRLST AFiles to list, Destination?A== Q> PCPYTYP GETFN DEFPAR DODIRLQ>PAR %>PAR6} DBUF10 $>( &CSRC;;IOCB10 IS SOURCE2 $ OPDIR;;OPEN IOCB10 AS DIRECTORY< X;F Q>DATA& P PBUFADZ6} Q>DATA& d PBUFADn X;x Q>& PBUFLEN Q> PBUFLEN X; $>;;CDES=IOCB00 QDELIM GCPY1FSP 6}QDELIM GSGFCPY GETFN2 'IBUF PIBUF SGFCPY$>  Q>GETCHR HDOCALL X;" CPY1FSPQ>GETREC, DOC6}ALL&CDES6 COPYF@ %!MENUSL;;THEN RETURN TO CMD. LINEJ X;T BADRN ERRXIT^ ANeed new file name!A==h CANTDV ERR6}XITr 9 ANo drive or directories allowed in new name!A==| X; LKMSG ALock A= ULMSG AUnlock A= DELMSG ADel6}ete A= X; X; F. LOCK FILES X; #LKFIL ALock which file?A== %>LKMSG $>LKMSG Q>LOCK 'HDOCMD2;;6}GET FILE NAME THEN LOCK IT X; X; G. UNLOCK FILES X; &ULKFIL AUnlock which file?A== %>ULMSG& $>ULMSG6}0 Q>UNLOCK: X;D 'DOCMD2'SECSIZ;;do mass lock/unlockN &&SECSIZ;;unless /Q is specifiedX 5b GETFNl CKDSKv $OP6}T (> Q;;Query? FDOPRM HAFTCHK;;branch either way X; X; D. DELETE FILE(S) X; %DELFIL ADelete what file?A==6} %>DELMSG $>DELMSG Q>DELETE X; DOCMD'SECSIZ &SECSIZ 5 GETFN CKDSK $OPT* ((> N;;IF 6}'/N' THEN DO IT THE EASY WAY4 FAFTCHK> DOPRM PRINTH  AAnswer 'Y' or 'N'A==R 7\ SETSCNf X;p RDFN SCNDIRz E6}DELX;;IF END OF DIRECTORY QSECSIZ $SECSIZ PRTMSG Q>PAR $>PAR PRTMSG PRINT A?A= C6}HRGET R> Y HNODELT $> CIOCL;;DELETE THE FILE THENNODELT!RDFNX; SMPLCMD5$ GETFN;;GET FILE NAME. 6}CKDSK;;VERIFY A DISK FILE8 AFTCHK7BISSCMDPICMDL$>V CIOCL` QICMDjR>)t FSETFNJ~DELX!MENUSLSET6}FNJ!SETFNMJCANTDV!CANTDVJBADRN!BADRNX;X; E. RENAME FILE(S)X;-RENFIL AFile to rename, new name?A==6} GETFN CKDSK%PTR QDELIMR> , FCKNAM2 R> ;;space HJBADRN CKNAM23( Q@FNPTR72R> :< FJCANTDVF6}R> >;;check for sparta typeP FJCANTDVZR> 0d DDORENn R> zx DCKNAM2DORENQ>RENAME HISSCMDX;X; Q. MA6}KE A DIRECTORYX;'MKDIR AFull directory name?A==$> &IAUXQ>";;MAKE DIR. COMMAND !SMPLCMDX;X;6} R. SET DIRECTORYX;1SETDIR ADirectory to be used as 'D:'?A== GETFN CKDSK"%PTR;;DRIVE OR NULL?,)>66} DCPYDNE@Q>)J !ISSCMDTX;^SETFNM$>hQPTRrN>| FZAPNAM%>Q> : R@FNPTR7 HALLNEW;;IF NOT SUBDIRE6}CTORY FNDEND2%FNAME9HFNDEND;;END OF OLD DIR?PFNAME9X; ALLNEW3 FCPYDNE R@FNPTR7 HALLNEW6}0;;POINT BACK AT ':')FCPY1ST;;IF START, NO ':' TO PRESERVEX;& CPYNAM20 CPY1ST3: Q@FNPTR7DZAPNAMPFNAME9N HCP6}YNAMX !MENUSLbX;lCPYDNE ERRXITv AInvalid directory!A==X;X; SINGLE FILE (DEVICE) COPYX;TOERR1!CIO6}ER1SGCOPY$>&CSRC;;SOURCE IS IOCB10 SOPEN ;;INPUT OPEN;;OPEN FUNCTION PAR;;INPUT DEVICE NAM GTOE6}RR1 !SGFCPYX;X; C. COPY FILES X; DUPFIL -CPYFIL AFile source, destination?A==*Q> ;;space4*PPAR36};;DEFINE CHAR 3 OF DEVICE NAME>Q>H PCPYTYPR GETFN;;GET SOURCE FILE NAME\X;fQ>DUPENDp PBUFADzQ>DUP6}END PBUFADX; QMEMTOP;S>DUPEND PBUFLENQMEMTOPS>DUPENDPBUFLENX; DEFPAR 6}QDELIM GSFNAME GETFN2Q>SFNAMEPSWPFLG$ TWARMST. QFNPTR8PIBUF B QFNPTRL PIBUF VQPAR;;6}DISK DEVICE?`R> Dj HSGCOPYt Q>PAR~ %>PAR DBUF10X;Q> ?%> QQQPPAR281HQQQX; C6}WFSD$>$ OPDIR;;OPEN IOCB10 AS DIRECTORYX;%>  CPSCL13 Q@FNPTR7 PPAR38( HCPSCL12 CPSCL21< Q@FNPTR6}7FR> :P FCPSCL3Z R> >;;account for sparta typed HCPSCL2n CPSCL33x 'FNPT2 Q@FNPTR7 FOPINPX;)$>;;SCAN -6}PAR- STARTING AT 1-ST BYTEMVMSKQ@FNPTR7GWCOPYB;;1 FILESPEC COPY??R> * FMVNMLR> . DWCOPYB HDOSTORQ>6} ;;space1DOSTORPPAR293 MVNML2"(>, DMVMSK6 SKPPRD3@MVEXTQ@FNPTR7J FWCOPYBTR> .^&FSKPPRD;;IF A6} PERIOD, SKIP OVER IThR> *r FOPINP|R> ;;space FWCOPYBR> , FWCOPYBR> FWCOPYB3SAVBLKPPAR2926}(>  DMVEXT EOPINPX;WCOPY CWFSDOPINP SCNDIR *CBYTE GOPINP& DWCNEXT0 !MENUSL:X;DWCOPYBQ> 6};;spaceN HSAVBLKXWCNEXTQ>PAR3bPIBUF0l Q>PAR3v PIBUF0X;$> %FNPT2WCNBLDQPAR29 FTE6}RMXR> ? HSTWCC QDATA9STWCCPPAR38R> ;;space FOVWRTC3 OVWRTC2(>  DWCNBLDQ> .  PPAR38*6}34WCEBLDQPAR29> FTERMXHR> ?R HSTWCEC\ QDATA9fSTWCECPPAR38pR> ;;spacez FOVWRTE3 OVWRTE2(> 6} DWCEBLD TERMXQ> . RPAR38 HNOTOVP1NOTOVPQ>$OPT(> Q HNOQUERYQ> ?NOQUERYPPAR38Q>6} PPAR38$X;. QCPYTYP8 HDOONEB Q>PARL $>PARV PRTMSG` PRINTj A-->A=t Q>PAR3~$>PAR36} PRTMSGQOPTR> Q HDOONE CHRGETR> Y HSKPCOPDOONEQIAUXPIAUX $>  &CSRCQ>6} PIAUX9  Q>PAR %>PAR DEFBUF( Q>OPEN2 SCMD< GCPYERRFX;P$>ZCKFDOSQCKDTST9d RPAR39n 6}HNOXDOSx0 HCKFDOS QPAR3PDOSRNMPDOSSYSQ>` PPAR3NOXDOSQ>PAR3PIBUF0 Q>P6}AR3 PIBUF0X;$> &IAUX0$>0 &CDES Q>GETCHR" COPYF;;COPY FILE,X;6SKPCOPQCPYTYP@ HTOEXIT6}J !WCOPYTTOEXIT!MENUSL^CPYERR!CIOER1hX;rX; I. FORMAT A DISK|X;FMT1050Q> HDOFMTX; FMTDSK ADis6}k to FORMAT:A=$ GETDN;;GET DRIVE NUMBER OR NAME DEFPARX; Q>PARPIBUF Q>PAR PIBUFX;6}%> Q@FNPTR7 PFMTDVNX;&"X; MAKE SURE ABOUT DRIVE NUMBER0X;: PRINTD& A(Press for Enhanced Dns)A=N 6} AType to Format Drive AXFMTDVN A0:A=bX;l CHRGETvR> A FFMT1050N> Y HALFMTDDOFMTPIAUXQ>7}$OPT;;REAL FORMAT?(> N HRELFMTW?RELFMTPIAUXX; Q>FORMAT PICMD$>  CIOV;;DO FORMAT 7}OF DISK IALFMTD $WBERR!CIOER1;;IF ERROR, SAY SO!*ALFMTD!MENUSL4X;>X; H. WRITE DOS/DUP TO DISKHX;RDUPFNM A7}D1:DUP.SYSA=\,WBOOT ADrive to write DOS files to?A=f GETDNpQDUPSYSz5Q> 1PDUPSYS PNMSAV%7}> Q@FNPTR7R> : HCANWB QDEFAULTCANWBPDOSSYSPDUPFNMX;%1;;SET UP INITIAL VALUES OF PARMS.'7}OPTQ> PSTATEX;$Q>DOSSYS.%>DOSSYS8 DBUF10B"Q>;;OPEN OUTPUT=WRITE DOS.SYSL PIAUXV1 ANYDEN;7};OPEN AND WRITE DOS.SYS (ANY DENSITY)` CLOS10j7t PNMSAV~PDUPSYSX;"X; **** WRITE DUP.SYS HERE ****X;7}%>pQ>DUPBASE$>DUPBASE D2B8AQ>DUPFNMPIBUFQ>DUPFNMPIBUF;;Bugs fixed RPQ7}>DUPEND  PHDBUF Q>DUPEND  PHDBUFQ>DUPLEN( PHDBUF2Q>DUPLEN< PHDBUFFQ>7}PPTEMP;;CLEAR 'RUN' FLAGZ!WRDUP;;WRITE DUP.SYSdX;nX; J. DUPLICATE A DISKxX;2DUPDSK ASource, Destination (S7 }ectors)?A== GETDN%> Q@FNPTR7M>;;GET DRIVE NUMBER PCSRC PCDES QDELIM;;IF SINGLE DRIVE DUP.R> 7 }(FSETSSZ;;GO SET SECTOR SIZE( GETDN2;;ELSE, GET SECOND DRIVE NAME%> Q@FNPTR7M> PCDESRCSRC;;SAME DR7 }IVE?"#HSETSSZ;;YES, SINGLE DRIVE DUP.,$>6 &SWPFLG@ SETSSZ>J %CSRCT QSWPFLG^L>@;;SET DUP-DISK FLAGh PSWPFLG7 }r GDODKDP| PRINT( AInsert both disks, type A= CHRGETX;DODKDP CWFSD QCSRC;;POINT TO SOURCE DRIV7 }E0 GETDEN;;IDENTIFY DENSITY OF SOURCE DISKETTE%CDES;;ELSE, TWO DRIVE DUP. $CSRCQDKTYPE9RDKTYPE8 FS7}AME 'UNNO SETDEN %CDES $CSRC QDKTYPE9& RDKTYPE80 FSAME: ERRXITD # ADrives not compatible!A==7}N SAMETWARMSTX V?b PSECSIZl W?v )PSECSIZ;;SET SECTOR SIZE (128 OR 256) &DUNIT;;READ SOURCE VTOC X; QDELIM7} 5 Q> > INIBMPPDATA9 PDATA9 0 HINIBMP 7;;BOOT COPY? R> ( 'FBLDVTOC;;YES, BUILD IMAGINARY VTO7}C!R> !FRDVTOC;;NO, DOS COPY!OOPS ERRXIT;;ELSE, ERROR ! AInvalid options!A==*!BLDVTOC GETNUM4!)> ->! HOOP7}SH! PDATAR! &DATA\! GETNUMf!)> )p! HOOPSz! PDATA! &DATA!%>!'PTR! 'DATA! 'DATA!Q>DAT7}A ! PBUFAD!Q>DATA ! PBUFAD!Q>!D26BB$DATA! (DATA! HD26CB" $DATA" (DATA" E7}D26D2$" D26CB;."U?8" NXTSCTB" HD26BBL"X;V"D26D2$DATA`" (DATAj" DD26EAt" HD26E4~" $DATA" (DATA" D7}D26EA" D26E4T?" NXTSCT" HD26D2"X;" D26EA;"U?" ED26EA" P@BUFAD7"X;" RDVTOC;# QMEMTOP # SSECSIZ# PBU7}FLEN#QMEMTOP(#SSECSIZ2#PBUFLEN<#X;F# QBUFLENP#R>DUPENDZ#QBUFLENd#S>DUPENDn# EENUFx# ERRX7}IT# ANot enough memory!A==#X;#NXTSCTED272E# P@BUFAD7#Q># #BUFAD# HD272E# #BUFAD#D272E#DATA7}# HD2736# #DATA# D2736:#X;$ ENUFQPTR$&FSKRDVT;;IF POS, SKIP READING VTOC$ Q>h"$ $>h,$ PDAUX6$ &7}DAUX@$ Q>DATAJ$$>DATAT$ PDBUF^$ &DBUFh$ RSEC1r$ INOERFD|$ !CIOER1$ NOERFD,$ QDATA$-O> ;;ADD IN7} THE BOOT, MAP AND DIR SECTORS$ PDATA$5DCK2BIT;;THEN TAKE CARE OF SECOND BIT MAP IF NEC.$##DATA;;ELSE, BUMP UPPER7} BYTE$CK2BITQDATA$R>$2DSKRDVT;;IF SINGLE SECTOR, SKIP READING SECOND$ #DATA$,$ QDBUF$ ODLEN% PDBUF% Q7}DBUF% ODLEN&% PDBUF0% "DAUX:% RSEC1D%X;N%SKRDVTQ>X% PDAUXb%Q>l% PDAUXv% QDATA % PCBYTE%Q>7}% PIPTR%Q>DATA %PVECTOR%Q>DATA % PVECTOR%X;%DORDQVECTOR% PPTRSAV%QVECTOR%PP7}TR% QIPTR& PIPSAV & QCBYTE& PCBSAV & QDAUX*& PSECTOR4& QDAUX>&PSECTORH&Q>R&$PCPYTYP;;SET OPERATION TO '7}READ'\&LRSQ>DUPENDf& PDBUFp&Q>DUPENDz& PDBUF&LRS1TCBYTE& "IPTR& HCBIT& #VECTOR& HPAGE1&#VECTO7 }R& PAGE1%>& Q@VECTOR7& PCBYTE&$>& &IPTR&CBIT*CBYTE& GASPT' QCPYTYP'T?;;CY=0, READ; CY=1, WRITE' Q7!}CSRC$'DRSECIN;;ACC=DRIVE #.' QCDES8'!RSECIN SECTIO;;READ OR WRITEB'IOD,L' QDBUFV' OSECSIZ`' PDBUFj' QDBUFt'O7"}SECSIZ~' PDBUF'ASPTQDAUX' RDATA' QDAUX' SDATA' DASPN'X;'QCPYTYP;;END OF DRIVE'ISTDD2;;IF 7#}READ, DO WRITE'!!MENUSL;;IF WRITE, THEN DONE!'X;'ASPN#DAUX' HASPX( #DAUX (*ASPXQBUFLEN;;ELSE, END OF THE BUF7$}FER?( RDBUF(QBUFLEN(( SDBUF2(ELRS1;;NO, GET NEXT SECTOR<(X;F( QCPYTYPP("ISTDD2;;IF WRITE, DO NEXT READZ( C7%}WFSDd( !DORDn(X;x(STDD2*SWPFLG( ICKFORM( PRINT(3IDD AInsert DESTINATION disk, press A=( CHRGET(CKF7&}ORMQ> N(ROPT( FNOFORM(POPT($> ;;IF FORMAT REQ., DO IT(Q>DOSSYS(%>DOSSYS( DEFBUF( Q>FORMAT) PIC7'}MD ) QCDES)#L> 0;;CONVERT DRIVE NO. TO ASCII")PDOSSYS,) CIOCL6)&NOFORM"CPYTYP;;THEN, MAKE A WRITE@) QPTRSAVJ) 7(}PVECTORT)QPTR^)PVECTORh) QSECTORr) PDAUX|)QSECTOR) PDAUX) QIPSAV) PIPTR) QCBSAV) PCBYTE)!LRS)7)}X;)X; P. CHANGE DISK FORMAT)X;)$CHDISK ADrive, new density:A=) GETDN;;GET DRIVE NO.) QDELIM)R>;;DRIVE NUM7*}BER ONLY?*"HCHDSK2;;IF SO, CHANGE DEFAULT*BADPCMD ERRXIT* ADrive unchanged.A==&*CHDSK2%PTR0* Q@FNPTR7:*>D*7+}%>N* Q@FNPTR7X*R> 9b* EBADPCMDl* S> 1v* DBADPCMD*?*3* 'UNNO*Q>*(> S* FTOSGL*(> D* HBADPCMD*T?*7,}TOSGLPDKTYPE8* DOFSIN*"!SHMEN;;THEN SHOW CHANGED MENU*X;+(X; O. CONFIGURE SYSTEM OR DISK DRIVE +X;+ CHKBANKS7-}= +%>;;This is BOB code...*+';;uncommented as4+';;per usual...H+QR+5\+$>f+ ?L1'p+Q@z+ PMAPBUF8+&7.}@+A+PMAPBUF8+3+H?L1+0+&+&+&@+&+&+$>+ ?L2',Q@,R>, H?NOT$,2.,&@7/}8,AB,?NOTPMAPBUF8L,3V,H?L2`, &RDKLMTj,X;t,$>~,?L8A,%>,?L6RMAPBUF8,F?FO,1,)>,H?L6,70}4;;was a DEY, ?L9', QMAPBUF8,P@,1,)>-H?L9 -7-P-Q>(-P2-Q<-PF-.P-:Z-X;d-?FOCn-P71}MAPAGE9x-2-(>A-D?L8-%>-H?L9-X;-X;-GETRDK PRINT- ARAM disk present?A=- CHRGET-%>-R> N-72} HRAMDSU- !NOFAST.RAMDSU PRINT.' Axlon or E type RAMdisk?A=. CHRGET". %>,. $>6.R> A@. HSAV73}ADRJ. %>T. $>^.SAVADR'RDAD1h. 'RDAD2r. 'RDAD3|. &RDAD1. &RDAD2. &RDAD3.R> A. FOKP0. CH74}KBANKS. QRDKLMT. HOKP1. PRINT.' ANo extra memory available!A==.%>. !NOFAST.OKP0!RAMDSU2.X;/ OKP1$>75}/ &NMLMAP/ &FR0&/T?0/T?:/ UFR0D/T?N/ UFR0X/T?b/PFR0l/ UFR0v/ IFP/ FASCII/ PRINT/! AUse d76}efault config for A=/%>/OKP2Q@INBUFF7/ GOKP3/3/ HOKP2/ OKP3M>/ P@INBUFF7/3/Q>/ P@INBUFF70 QIN77}BUFF 0$INBUFF0 PRTMSG 0 PRINT*0 AK?A=40 CHRGET>0R> NH0 FRAMDSU2R0 !DVNOQ\0X;f0RAMDSU2 PRINTp0 ASize(78}K)?A=z0 GETLIN0 GETNUM0VVECTOR0W?0VVECTOR0W?0VVECTOR0W?0VVECTOR0W?0 HSAVRDS0Q>079}SAVRDSPRDKLMT0X;1X;1GETSEQN PRINT1 APage sequence?A=$1 GETLIN.1 GETNO281)>CRB1 HFSNUML1 FRSEQV1DVNO7:}Q PRINT`1 ARAM disk drive no?A=j1GETRDRV CHRGETt1%> ;;ASSUME 9~1R> 01*DNOFAST;;IF DIGIT, CHANGE RAMDISK CODE1R7;}> 91 ENOFAST1M>1?1(NOFAST'RAMDKU;;SET RAMDISK UNIT NO.1:1X;1 RSEQ?1 $PGMAP81 &NMLMAP1)>2 ECPAXSQ 27<} QSQMAP82$>2 CPY0U?(2U?225<2U?F2U?P2U?Z2M> d2?n2CPY1QSQTAB8x2 PMAPAGE922232A2M>2 HCPY1272(7=}>2 HCPY02CPSEQQSQTAB92 PMAPAGE9222(>@2 HCPSEQ3 FDVNOQ3X;3CPAXSQ$>@"3 AXSQL0,3A63 PMAPAGE9@3 HAXS7>}QLJ3 FDVNOQT3X;^3 FSNUM$>h35r3A|3FSNCLPDATA9323 HFSNCL373FSLP1&UNNO3)>CR3 FTONML3PDATA@7?}93>3QDATA93 HBADSEQ3"DATA93%PTR3 Q@FNPTR74R>CR4 HFSLP44 GETLIN&4FSLP4 GETNO204 $UNNO:42D47@}(>@N4 HFSLP1X4TONML(RDKLMTb4 HWRONGl4 PNMLMAPv4 UPDLP104QDATA@94 PMAPAGE94A4 HUPDLP14 !DVNOQ4BAD7A}SEQ PRINT4( ADuplicated sequence number!A==4 !GETSEQN4X;4WRONG PRINT4% AWrong number of entries!A==4 !7B}GETSEQN4X;5PGMAP ===== 5SQMAP ==K===5X; 5SQTAB ===*5 ===45 ===>57C} ===H5X;R5 ===\5 ===f5 ===p5 ===z5X;5 ===5 ===Θ5 ===7D}5 ===5X;5 ===5 ===5 ===5 ===5X;5CONSYS PRINT5 AVerify WRITEs?A7E}=5 DOVRFY6 PRINT6! ANumber of File Buffers?A=6 GETLIN$6 GETNUM.6>86 FSKPFCTB6R>L6 ESKPFCTV6&PFILES;;S7F}ET NUMBER OF FILES (0-16)`6SKPFCT GETRDKj6 MDINIT;;REINITIALIZE DOS3t6 !DOSOS~6X;6ZAPDRVQ>Ғ6 ,;;SKIP 2 BYTES6 7G}SET52Q>R6 %UNNO6PDRVDEF86 CLRHDS6CONXIT!MENUSL6X;6(CONFGR ADrive number or :A=6 CHRGET;;GET 7H}DRIVE NUMBER6.R>;;IF RETURN, GO TO SYSTEM CONFIGURATION6 HCONDRIV7 !CONSYS 7CONDRIVR> 97 DSAVDVN7TOBADP!BADPCM7I}D(7SAVDVNS> 127 DTOBADP<7?F73P7 'UNNOZ7%Q>;;THEN ZERO CONFIGURATION BYTEd7PDRVDEF8n7X;x7 PRINT7 ARemove7J} drive?A=7 CHRGET7R> Y7 FZAPDRV7 PRINT7 AIs drive configurable?A=7 CHRGET7#R> Y;;IF NO, SET TO $52 AND E7K}XIT7 HSET527 PRINT7 AHigh capacity drive?A=7 CHRGET7R> Y8 FGETHCD8 PRINT8 AIs drive double sided?A="7L}8 CHRGET,8R> Y68 HSETSS@8Q>J8 ORDRVT8SETSS PRINT^8 ATracks/side?A=h8 GETLINr8 GETNUM|8R>#8 FSET358?7M}8Q>08)>M8 FSETTKS8Q> 8)>P8 FSETTKS8Q>8)>(8 HSETSS8SETTKS ORDRV8SET35 PRINT9 AStep rate?A=7N}9 CHRGET9R> 4&9 ESET3509 S> 0:9 DSET35D9T?N9 ORDRVX9 CLRHDSb9 !MENUSLl9X;v9GETHCD PRINT9" ADrive size7O} (in sectors)?A=9 GETLIN9 GETNUM9(>9FGETHCD;;INVALID SIZE959 %UNNO9Q>9PDRVDEF89Q>9PDKTYPE7P}8979 SETHDS: !MENUSL :X;:#X; S. Set RAMdisk Drive Number :X;*:#RAMDRV ARAM disk drive no?A=4: GETRDRV>: 7Q}!MENUSLH:X;R:$X; V. Set Verify Flag ON or OFF\:X;f:VERIFY AVerify WRITEs?A=p: DOVRFYz: !MENUSL:X;:DOVRFY C7R}HRGET:$>W;;ASSUME YES!:R> N: HDOVFY:$>P:/DOVFY&WRCMD;;SAVE THE WRITE COMMAND IN DOS:::X;:ORDRV%UNNO:L7S}DRVDEF8:PDRVDEF8::;X;;CLRHDS$>;A$;SETHDS%UNNO.;PHDTAB88;AB;PHDTAB8L; !DOFSIN%UNNO:L4r0 #X;save#d:MDUP3.M65 MYDOS moduleX;X; K. SAVE FILE COMMAND(X;28SAVFIL ASAVE:filename,start,end(,init(,run));U}A==< GETFNF 'IBUFPPIBUFZQOPTd5n GETNO2x(>DUPEND%>p EDSLMFG4%>`;;FORCE MEM.SAV T;V}O MEMORY BEFORE SAVING IMAGEDSLMFG D2B8A GETNO2 PHDBUF &HDBUF; SHDBUF PHDBUFA SHDBUF;W} IADDOK ERRXIT% AInvalid START-END range!A==ADDOKPHDBUF" #HDBUF, HINCOK6 #HDBUF@ INCOKQ>;X}J)>CRT FNINTAD^ GETNO2h PINITADr&INITAD|LINITAD FNINTADQ>;;SET 'GOT INIT' FLAGNINTADPTEM;Y}P)>CR FNRUNAD GETNO2 PRUNAD &RUNAD LRUNAD FNRUNAD #TEMP#TEMP;;SET 'GOT RUN' FLAG NRUNA;Z}D7 WRDUP%>'OPT1& 'VECTOR0'VECTOR:X;DX; OPEN THE PROGRAM FILENX;X%>bR> Al HOPTOK1v"OPT;[}3OPTOK1'IAUX$>+ ANYDEN;;OPEN FILE 'OUTPUT/ANY DENSITY' GKIOERRQOPTFFULHDR;;IF NO 'APPEND' DOIO;\};;WRITE SHORT HEADER   PUTCHR VECTOR GKIOERRKEXITQHDBUF  PILEN QHDBUF PILEN;]}* QHDBUF4 PIBUF> QHDBUFHPIBUFR *STATE\ GKMSAVf !WDR1pKMSAV!WDRzX;FULHDR WR6BYT IKE;^}XITKIOERR!CIOER1X;D2B8APHDBUF &HDBUF 'STATE:X;#X; N. LOAD PROGRAM INTO MEM.SAVX;0MEMSAV ;_}ALoad MEM.SAV from what file?A== QSTATEL>;;TURN ON MEM.SAV FLAG GLOADITTOMEN!MENUSL$X;.!X; L. LOAD U;`}SER FILE FUNCTION8X;BBDLDFL%>LBLOWUP!CIOER1VX;`'LDFIL ALoad from what file?A==j QSTATEtM>;;TURN OFF;a} MEM.SAV FLAG~LOADITPSTATE GETFN 'IBUFPIBUF$DATA;;JUST A CR? FTOMENQ> PIAUX$>;b} ANYDEN DOIO   GETCHR  DATA GBLOWUP QDATA( MDATA2R>< HBDLDFLF QDATAP FTOME;c}NZQOPTdN> Nn FGOTNxQ> PWARMSTQ> GOTNN> PIAUXQ>' PICMD Q>CIOV$>CIOV H;d}BRUN1X;X; B. RUN CARTRIDGEX; STCAR QN>P"R,'HNORAM;;IF ADDRESS SPACE IS NOT RAM6N>@;e}P;;IF RAM, NO CARTRIDGEJNOCART ERRXITT ANO CARTRIDGE!A==^X;h NORAM$r#HNOCART;;IF NOT ATARI CARTRIDGE;f}| QCARTST$CARTSTBRUN1PVECTOR&VECTOR QINISAV PDOSINIQINISAVPDOSINI QSTATEM>;g} PSTATE !LDFILEX;X; M. RUN AT ADDRESSX;%BRUN ARun from what address?A= GETLIN& Q@FNPTR70R>;;NO ;h}ADDRESS?:FBRUN2;;IF SO, ABORTD GETNO2N)>X HBRUN2b%>l 'WARMSTv FBRUN1BRUN2 ERRXIT, AAddress must b;i}e 1-4 hex digits!A==X;*X; PUT A SINGLE CHARACTER ON THE SCREENX;CHRPUT$>PUTCHR &ICMD$> &ILEN &;j}ILEN !CIOVX;X; PUT MESSAGE TO THE SCREENX; PRTMSGPRAMLO &RAMLO PRTNXT$>* Q@RAMLO64 FPRTXIT>;k} CHRPUTHPRTENT#RAMLOR HPRTNXT\ #RAMLOf HPRTNXTp PRTXIT:zX;X; PRINT AN IN-LINE STRINGX; PRINT7 ;l}PRAMLO7 PRAMLOPRTMEN PRTENT QRAMLO5 QRAMLO5:X; #X; READ A BYTE FROM THE KEYBOARD X; !;m}CHRGET XE424;;FETCH THE BYTE$ )>. +GKILLRD;;IF BREAK OR EOF, ABORT COMMAND8 R> z;;> LOWER CASE Z?B ENCHGCSL R> a;n};;< LOWER CASE A?V DNCHGCS` S> ;;CONVERT TO UPPER CASEj NCHGCS5;;SAVE ITt R>~ FCHRXIT;;IF EOL, ECHO IT  CHRPUT;;o};ELSE, ECHO IT Q>;;FOLLOWED BY EOL CHRXIT CHRPUT 7;;RESTORE FOR PROGRAM :;;THEN EXIT )KILLRD CHRPUT;;MOVE TO N;p}EXT LINE AND +!MENUSL;;EXIT WITHOUT RETURN TO COMMAND X; *XE424 CLOSE7;;get a chr from keyboard & SOPEN;;Open #7 for;q} keyboard input =OPEN KDEV  DOIO;;get a character  p===== 5;;save it for a sec C;;save error st;r}at( 52 CLOSE7< 7;;get error stats againF ?P 7;;get character backZ :;;that's all, folks!d KDEV AK:A=;;handler ad;s}dr.n X;x CLOSE7 DOIO;;close IOCB #7  p=== == : X; %X; RAW SECTOR READ/WRITE FUNCTIONS X; RSEC1QCSR;t}C RSEC2, X; SECTIOPDUNIT Q> PRCNT 6 CLD1$SECSIZ 2 8 6" BSIOR, IDRTS6 R>@ FTOERR2J ";u}RCNTT ICLD1^ TOERR28h !CIOER1r X;| DRTS8 : X; 'X; CHECK FOR 2-COLUMN DIRECTORY LIST X; CLEARIT$CSRC Q;v}ICMD9 R>GETCHR FCLERXIT QDATA& R> 0 EEOFEXIT %ILEN9 )> DSHFNL "ILEN9 %>& SFTSIZQDATA;w}80 PDATA8: 3D HSFTSIZN SHFNLQTOGGLX N>b PTOGGLl PDATAv CLERXIT: X; EOFEXITQ> RTO;x}GGL FCLERXIT "IBUF9 #ILEN9 PDATA' : X; TOGGL  X; 4X; COPY ONE FILE (AS MANY MEMORY LOADS AS NEE;y}DED) X; COPYFL$CSRC QILEN9 LILEN9 FNOOUTP* QSWPFLG4 IWRFILE> Q>IDDH $>IDDR PRTMSG\ CHR;z}GETf $CDESp RESETz WRFILE$CDES HDOWRFI CLEARIT $> DOWRFIQIOCB9;;OPEN? "IPUTOUT;;YES, WRITE NEXT BLOC;{}K X; $OPT Q> (> A;;APPEND? HDOPO1 Q> DOPO1$CDES PIAUX9! ANYDEN;;OPEN THE OUTPUT FILE GTOCIOR;|}X;$PUTOUT$CDES. %CSRC8 QILEN8B PILEN9L QILEN8V PILEN9` QIBUF8j PIBUF9t QIBUF8~ PIBUF9 Q>;}}PUTCHR PICMD9$ CIOCL;;WRITE NEXT BLOCK OF DATANOOUTP$CSRCQISTAT9;;EOF?R> FCPYXIT QSWPFLG IRECOP;~}Y Q>ISD $>ISD PRTMSG CHRGET  $CSRC RESET !RECOPY(X;2COPYF$CSRC< PICMD9FQ>P PTOGGL;}ZRECOPY$CSRCdQ>nPDATAx QBUFAD %BUFAD DEFBUF QBUFLEN PILEN9QBUFLEN PILEN9 ;}CIOV;;READ DIRECTORY DATA ITOCPFL)>;;END OF FILE?HTOCIOR;;IF ERROR, ABORTTOCPFL!COPYFLTOCIOR!CIOER1;}X;CPYXIT$CDES FNOTCL CLOS2"'QDOSRNM;;NEED TO RENAME DOS.SYS?, FNOTCL67 SOPEN;;IF COPYING DOS.SYS (REALLY;} 'DIAMOND'OS.SYS)@ J DELETET$ DOSRNM;;DELETE EXISTING DOS.SYS^ SOPENh r OPEN| DOSSYS;;MAKE NEW ONE ;}SOPEN;;and close DOS.SYS = ==;;writingQ>;;CLEAR RENAME FLAGPDOSRNMNOTCL$CSRC !CLOS2X;X;;}1X; SCAN DIRECTORY AND BUILD THE NEXT FILE NAME#X; EXIT WITH NOT-EQUAL IF AT ENDX;SCNDIRQ>DATA%>DATA ;}DBUF10 Q>GETREC PICMD&Q> 0 PILEN:Q>DPILENN"PCBYTE;;ASSUME NOT A DIRECTORYX CIOCL;;READ A ;}FILE NAMEb QDATAlR> :v ENOTDIRR> 0 ESCNDXNOTDIRFGOTSPC QDATA  RCBSAV HNOTSYSGOTSPC"CBYTE;}NOTSYS$FNPT%>X;MDN1QDATA8R> ;;space FMDN2 PPAR9 23 )> * DMDN14X;> MDN2Q> .H PPAR9R;}2\%> fMDN3QDATA8pR> ;;spacez FMDN4 PPAR932)>  DMDN3 MDN4Q> . RPAR9 HMDN50!MDN;}5Q>;;TERMINATE FILE NAME PPAR9, SCNDX:X;GETLINQ>DATA  PFNPTR$ PIBUF.Q>DATA 8 PFNP;}TRB PIBUFL Q>GETRECV PICMD`$>j &ILENt0~ &ILEN%>'PTRX;CIOCL CIOVC GCIOER1:;}CIOER1'FR0Q> PFR0 IFP FASCII%>  Q@INBUFF7 PCIERC3( Q@INBUFF72 PCIERC<3F Q@INBU;}FF7PM>Z PCIERCd ERRXITn AError -- AxCIERC A000A==X;HEXDEF%DATA)> HGETNO2:X;;} GETNUM, $;;SKIP SINGLE BYTEX; GETNO2; WTEMP2 NXTFLD 'VECTOR'VECTORGETNDQ@FNPTR73"R> F;};;IS IT A DIGIT, EGETNDE6S> 0;;NOTE THAT CY=0@ DGETND1J R> ;;0-9?T *TEMP2^ IGOT10h!DGOT1;;YES, SHIFT INTO ;}NUMBERr R>;;A-F?|EGOT16;;YES, HANDLE IT GETND1; O> 0GETNDE'PTR? QVECTOR$VECTOR:X;GO;}T10EGETND15 TVECTORUVECTOR QVECTOR$VECTOR TVECTORUVECTOR& TVECTOR0UVECTOR:,D OV;}ECTORN PVECTORX7b6l,v OVECTOR PVECTORAOVECTOR8O>PVECTOR !GETNDX; GOT16S>;}GOT1TVECTORUVECTOR TVECTORUVECTOR TVECTOR UVECTOR TVECTOR UVECTOR* LVECTOR4 PVECTOR>;} !GETNDHX;R0X; GETFN -- READ A LINE, GET FILENAME FROM IT\X;f GETFNQ>pPDOSRNMz GETLIN FWCTSTLX;>X;;} GETFN2 -- EXTRACT A FILENAME FROM A LINE ALREADY READ IN-X; X IS THE OFFSET IN THE BUFFERX;GETFN2 NXTFLD;}WCTSTLQ@FNPTR73R> ?FSETWC;;IF ? OR * FOUND,R> *'HCKEOFN;;SET FLAG, FIND FIRST MATCH SETWCQ> PCPY;}TYP FWCTSTLX;$0CKEOFNR>;;IF EOL, CONTINUE WIT SINGLE FILE. FFNSET8R> .B FWCTSTLLR> /V DFNSET` HWCTSTLj;}SLSHLPQ@FNPTR7tR> S~ HNCPSYS PCBSAV FSAVEDNCPSYSR> X HNOTSWPQ> PSWPFLG GSAVED!NOTSWPPOPT;;;}SAVE OPTION CODE SAVED1Q> P@FNPTR733  Q@FNPTR73R> /( FSLSHLP2R> .< DFNSETFR>P FFNSETZ1;}dX;n+FNSET'PTR;;SAVE POINTER TO SECOND ARG.x1 Q@FNPTR7 PDELIMQ> P@FNPTR7? Q@FNPTR7R> 0 DDEFD;}RVR> : FDEFDRV3 ELKFCOL>Q> : R@FNPTR7 FDBEFOR"1, P@FNPTR76A@ HDGTCODJX;T&LKFCOLQ@FNPTR7;;};SCAN FOR DRIVE ID^ FDEFDRVhR> :rFDEVINC;;DEVICE INCLUDED|3 Q@FNPTR7R> : FDEVINCX;DEFDRVQ> :DGTC;}OD DECFNPDBEFORQ> D DECFNPDEVINC%FNPTR QFNPTR:X; NXTFLD,QPTR;;MOVE INDEX TO A OFNPTR P;}FNPTR&Q>0?: OFNPTRD PFNPTRN:XX;bDECFNP%FNPTRl HDECFP1v "FNPTRDECFP1"FNPTR#PTR%>;} P@FNPTR7 GETDN1:X;2X; REQUIRE A DISK DRIVE (NO FILE SPECIFICATION)X;&GETDN2 GETFN2;;GET NEXT FILE NAME&!;}GETDNE;;THEN CHECK FOR DRIVE ONLYGETDN GETFNGETDNE'IBUFPIBUF%>  GETDNL3>  Q@FNPTR7* HGET;}DNL4 (> :;;ANY FILE NAME INCLUDED?>FGETDN1;;NO, THEN RETURNH ERRXITR# AFile name not allowed!A==\X;f%X; UPDAT;}E DENSITY OF DISK IN DRIVEpX;zGETDENR> : HGTDEN2 QDFUNIT GTDEN2M>;;MAKE UNIT BINARY$> &DAUX2 ;}&DAUX$>DATA  &DBUF$>DATA  &DBUF RSEC2 GGETDN3 !RDCONFX;L Q@FNPTR7VR> D` FGETDN3j E;}RRXITt ANot a disk file!A==~X;X; WAIT FOR SOURCE DISKX;CWFSDQSWPFLG GWFSD GETDN3:;;IF NO WAIT REQUI;}REDWFSD PRINT.ISD AInsert SOURCE disk, press A= CHRGET *SWPFLGKGETDN3;;IF IN DUP-DISK $CSRC;}X;RESET%IOCB9  'UNNO QIAUX9 FNOCHG(R>2 ENOCHG<SETDENPDKTYPE8F$>PSAVMAPQMAPBUF9Z PSA;}XMAP9d0n ISAVMAPx DOFSIN$>RSTMAPQSAXMAP9 PMAPBUF90 IRSTMAPX; NOCHG:X;"SAXMAP ===;}==== =======X;+X; RECONFIGURE DENSITY OR CONFIGURATIONX;DOFSIN$> DOFLOPQWOTDCB;}9PDUNIT9"0, IDOFLOP6$>1@ &DUNITJ $UNNOT'&DUNIT;;TELL SIO DRIVE TO CONFIGURE^(%DKTYPE9;;GET DENSIT;}Y/SECTOR SIZEh(QDRVDEF9;;GET DRIVE SPECIFICATIONr !CONFIGR;;GO CONFIGURE DRIVE|X;FX; SET UP PAR AND IOCB10 FOR A D;}IRECTORY SCAN (MULTI-FILE ACTIVITY)X;SETSCNPICMD  Q>PAR $>PAR PIBUF &IBUF  SETPTR!;}$>;;OPEN IOCB10 AS DIRECTORYX;%OPDIRQ>;;OPEN IOCB AS DIRECTORY PIAUX9X; .X; OPEN A FILE INDEPENDENT OF DRIVE;} DENSITY X; ANYDENQ>& PIAUX90 PIAUX9: Q>OPEND SCMDN ISAVDENX !CIOER1b X;l SAVDEN%DUNITv QDKTY;}PE8 PIAUX9 : X; 'X; SET UP 'PAR' FOR A WILD CARD COPY X; DEFPAR SETPTR Q@FNPTR7 HDEFPX PCPYTYP ;} PPAR8 Q> * PPAR8 PPAR8!Q>;;termination!!! ! PPAR8! DEFPX: !X;*!SETPTR%>4! SETLP13>! Q@FNPTR7;}H! PPAR8R! HSETLP1\! SETLP21f! QPAR8p!R> :z! FSETLP3! R> >;;account for sparta type! HSETLP2! SETLP33! 'FNPT!:;}!X;!%DOSRNM ADA==A:A=`=AOS.SYS,A!CKDTST ADOS.SYSA=!X;!'X; REPORT ERROR, THEN RETURN TO MENU!X;! ERRXIT;}7! PRAMLO"7" PRAMLO"7 PRTENT;;WRITE ERROR MESSAGE FOLLOWING 'JSR ERRXIT'$" !MENUSL;;THEN RETURN TO MENU."X;8"+X;;} Subroutines moved from resident code:B"X;L".X; SAVE MEMORY SUBROUTINE: WRITE FILE BODY,V"X; INIT AND RUN VECTORS`"X;j"&W;}DR LDMEM;;LOAD MEM.SAV IF NEEDEDt"%WDR1$>;;WRITE TEXT TO DISK FILE~" CIOV"IWRERNO;;don't use BMI!"WRERRO2!SAVERR;}"WRERNO$>INITAD" WRVEC"$>RUNAD" WRVEC" *STATE" KGODOS1" !NOWMS"GODOS1!GODOS"X;"*WRVECVTEMP;;};WRITE THIS 6-BYTE VECTOR?#DRTS2;;IF NOT, JUST RETURN # &VECTOR#QINITAD9#PVECTOR(#22#QINITAD9<#PVEC;}TORF#Q>INITADP#PVECTORZ#PVECTORd#!&VECTOR;;(X,A)=MIDDLE WORDn#WR6BYT DOIOx# ==# PUTCHR# ;} VECTOR# IRTS2# !WRERRO2# RTS2:#X;CTORd#!&VECTOR;;(X,A)=MIDDLE WORDn#WR6BYT DOIOx# ==# PUTCHR# 8+ MYDOS 4.50 Source Code Documentation ?} Copyright (C) 1988 by WORDMARK Systems and the authors: Charles Marsle?}tt 2705 Pinewood Dr. Garland, TX 75042 ?} CIS: 73317,3662 UseNet: CHASM@KILLER.DALLAS.TX.US ?} and Robert Puff Suite 222 ?} 2117 Buffalo Rd. Rochester, NY 14624 GEnie?}: BOB.PUFF This software may be freely used and distributed provided that this copyright not?}ice is left intact, and provided that: (1) The source code in machine readable form is provided with any ?}binary distribution, or made available at no additional cost to the recipients of the binary distribution. ?} (2) A binary version of a derivative work may be sold for a reasonable distribution charge (less than $50), and th?}e source code in machine readable format must be available. (3) A derivative work may not impose and rest?}riction on the free distribution of the source code. This is the source code ?}to MYDOS version 4.50. It is in MAC/65 tokenized code. Use the LOAD#filename command to load. If you do not have?} the MAC/65 cartridge (or disk versions), there is a program in the May 1988 (issue #60) of A.N.A.L.O.G. magazine that w?}ill allow you to read the files. Here are a few notes on how to create a working copy of MYDOS from?} the source: (1) It is easiest to use an older version of MYDOS to assemble the new DOS. All filenames used ?}in assembling use the D: default drive number; so go to your DOS menu, and set the default drive (and directory) to?} where your source code resides. The source code and object files will all fit on one double density disk. If you only?} have single density drive(s), then separate the MDOS and MDUP files, but put the object files on the same disk pri?}or to BUILDing. Now exit back to MAC/65. (2) LOAD#D:MDOS.M65, and ASM,,#D:MDOS.OBJ. This will assemble the?} main part of the resident code. (3) LOAD#D:MDUP.M65, and ASM,,#D:MDUP.OBJ. This will assemble the rest ?}of the resident code, and also the non-resident DUP.SYS part. (4) Now go back to DOS, and binary Load BUILD.OBJ. ?}This file will read the MDOS.OBJ and MDUP.OBJ files you just created. Press START, and you will be in the new DOS!?} Now use the [H] command to write out DOS files, and you're set! What the files contain The ?}MDOS.M65 and MDUP.M65 files are "header" files, that have some equates, and simply INCLUDE the actual source files (sour?}ce files are MDOS1.M65, MDOS2.M65, MDOS3.M65, MDUP1.M65, MDUP2.M65, and MDUP3.M65). Be warned that there are absol?}ute references that MDUP makes to the MDOS files; if the MDOSx files are modified in any way, these references will?} need to be changed as well. They are located in the very beginning of the MDUP.M65 file. The DOS.SYS f?}ile itself is contained mostly in the MDOSx files; but the code that takes care of MEM.SAV and loading DUP.SYS is in the?} file MDUP1.M65. Because the dos is split between two files, you must take note of the last byte the assembly of M?}DOS.M65 produced, and place this address in the "ORIGIN = xxxx" statement in the MDUP.M65 segment, or the possibili?}ty of both files running into each other will exist. I think that is about it. If you find/correct any ?}bugs, or do any major modifications, Mr. Marslett and I would like to see them. Please see the above references on ?}how to contact us. Bob Puff 11/28/88 m. Please see the above references on <R%